0 背景
最近好几次面试被问到SurfaceView的特点了,都没回答出来。
SurfaceView和TextureView也是Compose这样的声明式ui唯二实现不了控件;因为他们就不是View,而是Android提供的和Surface相关的显示系统 。
特此简单了解一下。
1 应用场景
高速刷新或者处理数据较大的内容,视频播放or相机取景等。如果需要对相机的数据进行二次处理再展示,推荐TextureView。
如果能在主线程中绘制,就不要用SurfaceView。
2 实现绘图板应用
代码链接:
https://github.com/talish7/CutomViewDemo/tree/master/Draw
3 Surface & SurfaceView & SurfaceHolder
相当于MVC架构
- Surface:
每一个Window都有会一个Surface;
有多个缓冲区;双缓冲区渲染
显示在屏幕的称为前端缓冲区,没显示的后端缓冲区;可以在后端缓冲区绘制下一帧的内容;
每隔一段时间交换两块缓冲区;
不透明的矩形区域 - SurfaceView:
持有一个独立的Surface; - SurfaceHolder:
Surface的持有者;
使用SurfaceView时并不能直接操作Surface,否则可能会产生一些不可预期的操作,所以Android为我们提供SurfaceHolder来间接操作Surface。
提供addCallback ( SurfaceHolder.Callback callback)
来监听Surface的生命周期。
4 注意
1)SurfaceHolder获取到SurfaceView自带的缓冲画布,并对这个画布加锁;
在绘制完成后,将缓冲画布释放,并将画布的内容更新到主线程的画布上。
2)SurfaceView是可以在子线程中执行绘制的,如果不对画布加锁,那么多个子线程同时更新画布就会产生无法预期的情况,所以需要加锁。
3)surfaceHolder.lockCanvas()时要进行必要的非空判断以及加入重试机制,绘制完成后,要及时释放画布。