为什么要使用SurfaceView来实现动画?
因为View的绘图存在以下缺陷:
- View缺乏双缓冲机制
- 当程序需要更新View上的图像时,程序必须重绘View上显示的整张图片
- 新线程无法直接更新View组件
SurfaceView的绘图机制
- 一般会与SurfaceView结合使用
- 调用SurfaceView的getHolder()方法即可获得SurfaceView关联的SurfaceHolder
SurfaceHolder提供了如下方法来获取Canvas对象
- Canvas lockCanvas():锁定整个SurfaceView对象,获取该Surface上的Canvas
- Canvas lockCanvas(Rect dirty):锁定SurfaceView上Rect划分的区域,获取该Surface上的Canvas
- unlockCanvasAndPost(canvas):释放绘图、提交所绘制的图形,需要注意,当调用SurfaceHolder上的unlockCanvasAndPost方法之后,该方法之前所绘制的图形还处于缓冲之中,下一次lockCanvas()方法锁定的区域可能会“遮挡”它
1 |
|
上面的程序为SurfaceHolder添加了一个CallBack实例,该Callback中定义了如下三个方法:
- void surfaceChanged(SurfaceHolder holder, int format, int width, int height):当一个surface的格式或大小发生改变时回调该方法。
- void surfaceCreated(SurfaceHolder holder):当surface被创建时回调该方法
- void surfaceDestroyed(SurfaceHolder holder):当surface将要被销毁时回调该方法