View框架不需手动“刷屏”,是因为View类本身提供两种重绘函数,其内部已封装了对画布的刷屏操作。但SurfaceView是自定义的绘图函数,而且每次获取到的Canvas仍然是上次使用过的画布。系统没有刷新画布,也没有重新提供一个画布,因此如果不刷新的话,必会遗留下以前画布的状态。所以,用SurfaceView视图,在得到其画布Canvas之后,应先进行刷屏操作,将画布上的内容全部清空,然后再进行绘图。
刷屏的方式有以下几种:
1.覆盖法,即是每次绘图之前,绘制一个等同于屏幕大小的图形覆盖在画布上。
public void myDraw(){
Canvas canvas = holder.lockCanvas();
//绘制矩形
canvas.drawRect(0,0,this.getWidth(),this.getHeight(),paint);
canvas.drawText("Game",textX,textY,paint);
holder.unlockCanvasAndPost(canvas);
}
每次在画布上绘制前都会绘制一个填充的,大小等同于屏幕的矩形覆盖画布,只要这个矩形的颜色等同于拼命默认的颜色,那就等同于将屏幕做了清屏操作。
2.颜色重绘法,有以下两种情况。
(1)每次绘图之前,在画布上填充一种颜色。
canvas.drawColor(Color.Black);
Canvas类的drawColor(int color)函数是往整个画布中填充一种颜色。
(2)指定RGB,每次绘图之前,指定RGB来填充画布。
canvas.drawRGB(0,0,0);
3.图片覆盖法,每次绘图之前,绘制一张等同于屏幕大小的图片覆盖在画布上。
在画布上绘制图形之前,首先绘制游戏的背景图,并且这张背景图一定要等同于屏幕的大小。