为什么要使用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将要被销毁时回调该方法