关于Canvas,先看API。在Dev Guide中的Canvas and Drawables中介绍到:
在UI线程中刷新view需要调用invalidate(),并处理回调方法onDraw()。如果在一个独立线程中,比如管理一个SurfaceView的线程中,就不需要调用invalidate()了。
一个Canvas就是一个画布,它通过了各种draw方法的接口。一个Canvas必须有一个bitmap对象,这个bitmap对象才是真正被绘制的对象。可以这样定义一个Canvas:
Bitmap b = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
Canvas类的API中介绍到:一个Canvas类能够处理各种"draw"方法。为了绘制事物,必须要有四个基本组件:一个用来放置像素的Bitmap对象,一个处理"draw"方法的Canvas对象,一个绘制对象(如矩形,路径,文本等)以及一个画笔(Paint)。
然后,Canvas中除了有一系列draw和set方法外,还有一对方法save和restore,使用他们可以对canvas中的局部元素实现修改而保持其他元素不变。如某个元素的旋转。从android sdk源码中可以看到save方法的源码:
/* (non-Javadoc)
* @see android.graphics.Canvas#save()
*/
@Override
public int save() {
// get the current save count
int count = mGraphicsStack.size();
// create a new graphics and add it to the stack
Graphics2D g = (Graphics2D)getGraphics2d().create();
mGraphicsStack.push(g);
// return the old save count
return count;
}
从中可以看到save()是将当前的canvas做了一个备份放到了一个Graphics的stack中去了,然后使用的restore:
@Override
public void restore() {
mGraphicsStack.pop();
}