简单了解一下SurfaceView

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()时要进行必要的非空判断以及加入重试机制,绘制完成后,要及时释放画布。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值