Canvas的意思是画布,表现在屏幕上就是一块区域,我们可以再上面使用各种API绘制我们想要的东西。可以说,Canvas贯穿整个2D Graphics,android.graphics中的所有类,几乎都于Canvas有直接或间接的联系。所以了解Canvas是学习2D Graphics的基础。
Android官方文档对Canvas的简介很好的介绍了Canvas的使用:
The Canvas class holds the “draw” calls. To draw something, you need 4 basic components: A Bitmap to hold the pixels,
a Canvas to host the draw calls (writing into the bitmap), a drawing primitive (e.g. Rect, Path, text, Bitmap),
and a paint (to describe the colors and styles for the drawing).
一个Canvas对象有四大基本要素:
1、一个用来保存像素的Bitmap
2、一个Canvas在Bitmap上进行绘制操作
3、绘制的东西
4、绘制的画笔Paint
如何获得一个Canvas对象
Canvas对象的获取方式有三种:
第一种我们通过重写View.onDraw方法,View中的Canvas对象会被当做参数传递过来,我们操作这个Canvas,效果会直接反应在View中。
第二种就是当你想自己创建一个Canvas对象。从上面的基本要素可以明白,一个Canvas对象一定是结合了一个Bitmap对象的。所以一定要为一个Canvas对象设置一个Bitmap对象。
//得到一个Bitmap对象,当然也可以使用别的方式得到。但是要注意,改bitmap一定要是mutable(异变的)
Bitmap b = Bitmap.createBitmap(100,100, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
/*先new一个Canvas对象,在调用setBitmap方法,一样的效果
* Canvas c = new Canvas();
* c.setBitmap(b);
*/
第三种方式,是调用SurfaceHolder.lockCanvas(),返回一个Canvas对象。
关于第二种方式,其实是一种双缓存设计
闪烁是图形编辑中的一个常见问题,当进行复杂的绘制操作的时候会导致呈现的图像闪烁或具有其他不可接受的外观.
双缓冲的使用解决这些问题.双缓冲使用内存缓冲区来解决由多重绘制操作造成的闪烁问题.
原因:
首先在内存缓冲区里完成所有的绘制操作,而不是在屏幕上直接进行绘图,当所有绘制操作完成后,把内存缓冲区完成的图像直接复制到屏幕.因为在屏幕上只执行一个图形操作,所以消除了由复杂绘制操作所造成的图像闪烁问题.
使用:
在android中实现双缓冲,可以使用一个后台画布backcanvas,先把所有绘制操作都在这个上边进行,等图画好了,然后再把backcanvas拷贝到与屏幕关联的canvas上去,如下:
Bitmap bitmapBase = new Bitmap();
Canvas backcanvas = new Canvas(bitmapBase);
backcanvas.draw()...//画图
Canvas c = lockCanvas(null);
c.drawbitmap(bitmapBase);//把应经画好的图像输出到屏幕上
unlock(c)...
参考:http://blog.csdn.net/lonelyroamer/article/details/8264189