java的绘图时,都接触过图像的双缓存技术,解决绘制频繁导致闪屏的问题。今天,记录一下安卓客户端自定义View的缓存技术。由于CPU访问内存的速度要远远快于访问屏幕的速度。安卓端如果需要绘制大量复杂的图像时,每次都一个个从内存中读取图形然后绘制到屏幕就会造成多次地访问屏幕,从而导致效率很低,因此需要使用缓冲技术提高效率。
第一层缓冲:(安卓自己实现)
绘制图像时不用上述中逐个绘制的方案,先在内存中将所有的图像都绘制到一个Bitmap对象上,然后一次性将内存中的Bitmap绘制到屏幕,从而提高绘制的效率。View的onDraw()方法已经实现了这一层缓冲。
第二层缓冲:(我们自己实现)
onDraw()方法的Canvas对象是和屏幕关联的,而onDraw()方法是运行在UI线程中的,如果要绘制的图像过于复杂,则有可能导致应用程序卡顿,甚至ANR。
因此我们可以先创建一个临时的Canvas对象,将图像都绘制到这个临时的Canvas对象中,绘制完成之后再将这个临时Canvas对象中的内容(也就是一个Bitmap),通过drawBitmap()方法绘制到onDraw()方法中的canvas对象中。这样的话就相当于是一个Bitmap的拷贝过程,比直接绘制效率要高,可以减少对UI线程的阻塞。
创建临时bitmap,进行相关绘制:
//创建缓存图片
Bitmap bitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888);
//将缓存图片设置为画布
Canvas canvas = new Canvas(bitmap);
//canvas进行绘制
//......
//绘制完成之后,记录下缓存
holder = bitmap;
调用已经绘制好的bitmap,显示(在onDraw方法中):
//调用的时候,只需要在onDraw方法里面,直接将holder绘制出来就可以了。
canvas.drawBitmap(holder,x,y,new Paint());
网友评论