关于SurfaceView的使用
1.SurfaceView和View之间的区别:
a.View主要适用于被动更新的情况下,而SurfaceView主要适用于主动更新,比如频繁地刷新;这里说明下主动更新和被动更新。
主动更新:比如要绘制一个人一直在跑动,那么这就需要独开一个线程不停地去绘制人的状态,为了避免阻塞主线程,这时候会采用surfaceView来实现。
被动更新:比如绘制棋谱类,对于这种我们通过onTouch事件,使用invalidate来更新画面即可。
b.View在主线程中对画面进行更新,而SurfaceView通常会通过一个子线程来进行页面的刷新,当然surfaceView也可以在主线程中去更新画面。但我们一般不会选择这么做,因为当主线程去更新画面且更新时间较长,那么主线程会被阻塞,导致无法响应按键,触屏等。
c.View在绘图时没有使用双缓冲机制,而SurfaceView在底层机制中就实现了双缓冲机制。
关于双缓冲机制原理的讲解推荐下面的博客,讲解的非常透彻:
总的来说:如果你自定义的View需要频繁刷新,或者刷新时数据量比较大,那么可以考虑使用SurfaceView。
2.surfaceView的使用方法:
a.创建SurfaceView:创建一个自定义的SurfaceView继承自SurfaceView,并实现两个接口——SurfaceView.Callback和Runnable,如下:
public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback,Runnable { @Override public void surfaceCreated(SurfaceHolder holder) { } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { } @Override public void run() { } }
以上便是我们创建的SurfaceView的基本架构了,当然还需要添加其构造函数,这里就不贴出来了。
b.初始化SurfaceView:
首先先定义相关变量:
//定义一个SurfaceHolder对象,SurfaceHolder可以看作是SurfaceView的管理者 private SurfaceHolder mHolder; //定义绘图的画布 private Canvas mCanvas; //定义子线程的标志,用来判断是否继续开启子线程