1、简单介绍
SurfaceView三个特点:
- 具有独立的绘图表面
- 需要在宿主窗口上挖一个洞来显示自己(其实是让上方变透明,并且surfaceview的绘制表面在Z轴上是低于主绘制界面的)
- 它的UI绘制可以在独立的线程中进行(一般的绘制都必须在主线程更新,自己开个线程专门用来给自己绘图,岂不是很爽~),这样就可以进行复杂的UI绘制,并且不会影响应用程序的主线程响应用户输入
推荐阅读:老罗:Android视图SurfaceView的实现原理分析
与View绘图的比较:
- View适用与主动更新,用户下意识与应用进行交互,例如:下象棋。SurfaceView即使用户不与之交互,也会频繁刷新,例如:跑酷时自己跑动的人、心跳的曲线
- View在主线程进行刷新,SurfaceView在自己的绘图线程进行刷新
- View在绘图时没有使用双缓冲机制,而SurfaceView则在底层已经实现了
- 所有绘图较为耗时的都可以用SurfaceView
2、基本用法
实例化一个SurfaceView
SurfaceView sf = (SurfaceView)findViewById(R.id.surface); 或 SurfaceView sf = new SurfaceView(this);
拿到此SurfaceView里的SurfaceHolder
SurfaceHolder sfh = sf.getHolder();
实现SurfaceHolder.CallBack接口
class MyCallBack implements SurfaceHolder.Callback{ @Override public void surfaceCreated(SurfaceHolder holder) {} @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {} @Override public void surfaceDestroyed(SurfaceHolder holder) {} }
这些回掉方法会在SurfceView创建、改变、销毁时调用
sfh.addCallback(new MyCallback());
拿到Canvas,开始绘图
//获取画布 Canvas canvas = sfh.lockCanvas(); //绘图逻辑 //提交画布 sfh.unlockCanvasAndPost(canvas);
- SurfaceView通常会使用一个线程进行绘制
- SurfaceView额外成员变量,标志位,控制线程
- 一般都会在子线程起一个无限循环,用标志位控制