我正在尝试绘制动画。为此,我扩展了View并覆盖了onDraw()方法。我期望的是每次调用onDraw()时,画布都处于我离开它的状态,我可以选择清除它或只是在其上绘制一部分内容(当我使用SurfaceView时它是这样工作的),但每次画布都已经被清除了。有没有办法让它不被清除?或者可以将先前的状态保存到位图中,这样我就可以仅绘制该位图然后在其上绘制其他东西?
我正在尝试绘制动画。为此,我扩展了View并覆盖了onDraw()方法。我期望的是每次调用onDraw()时,画布都处于我离开它的状态,我可以选择清除它或只是在其上绘制一部分内容(当我使用SurfaceView时它是这样工作的),但每次画布都已经被清除了。有没有办法让它不被清除?或者可以将先前的状态保存到位图中,这样我就可以仅绘制该位图然后在其上绘制其他东西?
我不确定是否有方法可以实现。但是对于我的自定义视图,我要么在每次调用onDraw()时重新绘制所有内容,要么绘制到位图上,然后将位图绘制到画布上(就像您在问题中建议的那样)。
这是我的做法
class A extends View {
private Canvas canvas;
private Bitmap bitmap;
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
if (bitmap != null) {
bitmap .recycle();
}
canvas= new Canvas();
bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
canvas.setBitmap(bitmap);
}
public void destroy() {
if (bitmap != null) {
bitmap.recycle();
}
}
public void onDraw(Canvas c) {
//draw onto the canvas if needed (maybe only the parts of animation that changed)
canvas.drawRect(0,0,10,10,paint);
//draw the bitmap to the real canvas c
c.drawBitmap(bitmap,
new Rect(0,0,bitmap.getWidth(),bitmap.getHeight()),
new Rect(0,0,bitmap.getWidth(),bitmap.getHeight()), null);
}
}
你应该在这里看一下基本视图和SurfaceView之间的区别。SurfaceView有一个专门的绘制层,我想它会跟踪你之前绘制的内容。现在,如果你真的想在基本视图上实现它,你可以尝试将每个绘制的项目放入一个数组中,就像地图视图的分项覆盖物示例一样。它应该工作方式基本相同。