SurfaceView
Surface相当于绘制的容器,所有View和子类都是绘制在这里面。
SurfaceView是View的子类,将Surface的数据显示出来。
View适用主动更新视图,不需要频繁刷新。在主线程更新UI,没有双缓冲机制。
SurfaceView适用于被动更新视图,频繁刷新。通过子线程更新UI,底层实现中就实现了双缓冲机制。
SurfaceHolder
SurfaceHolder是Surface的抽象接口,操纵surface的控制器。
使用SurfaceView的getHolder()方法,获取SurfaceHolder对象
在SurfaceView使用中需要的几个重要方法:
void addCallback(SurfaceHolder.Callback var1); //为SurfaceHolder添加一个SurfaceHolder.Callback回调接口 void removeCallback(SurfaceHolder.Callback var1); //从Surface持有者中删除回调接口 Canvas lockCanvas(); //获取Canvas对象,并锁定 void unlockCanvasAndPost(Canvas var1); //释放同步锁,并显示 void setFormat(int var1); //指定surface的像素格式,PixelFormat常量 void setFixedSize(int var1, int var2); //固定Surface的宽高 void setKeepScreenOn(boolean var1); //false是允许屏幕关闭,true强制屏幕打开状态
SurfaceHolder.Callback
实现SurfaceHolder.Callback接口,创建SurfaceView的生命周期,它有三个回调方法:
@Override public void surfaceCreated(SurfaceHolder holder) { //Surface创建的时候调用 } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { //Surface大小被改变的时候调用 } @Override public void surfaceDestroyed(SurfaceHolder holder) { //Surface被销毁的时候调用 }
实现Runnable接口,利用子线程做绘图操作
绘制方法需要在绘制前调用locakCanvas锁定画布,得到画布。
绘制完成后需要调用lockCanvasAndPost方法来解锁画布,显示。
@Override public void run() { draw(); } private void draw() { try { mCanvas=mHolder.lockCanvas(); //绘制 }catch (Exception e){ }finally { //避免黑屏情况,解锁画布 if(mCanvas!=null){ mHolder.unlockCanvasAndPost(mCanvas); } } }