我正在尝试绘制动画。为此,我扩展了 View 并覆盖了 onDraw() 方法。我期望的是,每次调用 onDraw() 时,画布都会处于我留下的状态,我可以选择清除它或只绘制它的一部分(这就是我使用 SurfaceView 时的工作方式) 但每次画布回来时都已经清除了。有没有办法我不能清除它?或者也许将之前的状态保存到一个位图中,这样我就可以绘制那个位图然后在它上面绘制?
问问题
39589 次
3 回答
28
我不确定是否有办法。但是对于我的自定义视图,我要么在每次调用 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);
}
}
于 2010-03-11T15:30:24.190 回答
1
你应该看看这里,看看基本视图和表面视图之间的区别。SurfaceView 有一个专用的绘图层,我想它会跟踪您之前绘制的内容。现在,如果您真的想在基本视图上执行此操作,您可以尝试将您绘制的每个项目放入一个数组中,例如mapview 的逐项叠加。它应该以几乎相同的方式工作
于 2010-03-11T07:57:07.507 回答
0
您的期望与现实不符 :) 画布不会是您离开它的方式,而是空白。您可以创建要绘制的对象的 ArrayList(canvas.drawCircle()、canvas.drawBitmap() 等),然后遍历 OnDraw() 中的 ArrayList。我是图形编程的新手,但我小规模地使用过它。也许有更好的方法。
于 2010-03-31T20:11:34.403 回答