-
什么是surfaceview?view和surfaceview的区别?
- 理解surfaceview需要先理解view,Android的绘制模型就是通过层级叠加view实现的,单布局和复合布局都是对view的继承和实现,view是Android绘制的顶级类,也是Android绘制的单位。
- view实现了Android的绘制,Android系统的显示还是依赖于屏幕的刷新显示,通过vsync信号告知屏幕刷新,60fps即1s发送60次信号,16ms发送一次,16ms内非ui逻辑和ui刷新能够完成,则ui刷新就会很流畅,若16ms内非ui逻辑或者ui绘制没有完成,此次刷新还是先前的ui显示,被称为掉帧,掉帧次数多了就会造成anr现象。
- 对于频繁刷新的需求,view就不能满足,这个时候需要使用surfaceview,借助于surfaceview的双buffer缓存及其支持异步绘制可以实现频繁刷新。
-
view和surfaceview的区别:
区别
-
surfaceview的三要素,特别注意surfaceview和surfaceholder通过callback串联系统才能执行surfaceview
- surfaceview三要素:surfaceview,surfaceholder,callback。
- surfaceview:主体,是surfaceview的核心实现,surfaceholder可以看作surfaceview的管理者,使用者不是直接使用surfaceview而是通过surfaceholder去操作surfaceview,callback则是surfaceview和surfaceholder的桥梁,串联了两者,callback声明了create,change,destroy三个回调方法,也表明了surfaceview的生命周期。
-
surfaceview使用流程(简要描述)
- surfaceview的使用通常借助于线程进行异步绘制,代码结构上通常可以封装代码模板。
- 继承surfaceview并实现callback和runnable
- 获取surfaceview的viewholder并添加callback串联两者
- 声明boolean值在create和destroy中控制开和闭,控制线程中的计算和绘制
- create中创建线程并启动线程
- runnable的实现run方法中进行计算和绘制并计算合适的刷新频率(借助于线程的睡眠时间实现)
-
surfaceview如何设置view背景
- 获取到canvas通过drawColor的方法设置其背景即可,不可以像传统view似的通过background设置背景。
-
surfaceview如何清空view绘制(二级缓存的原因会保留先前的绘制)
- 二级缓存的原因,surfaceview会保持上一次的绘制痕迹,类似于path的绘制,有时效果可以借助这个特性实现,比如绘制圆的扩散,但是通常下一次绘制不需要保留痕迹。
- 不保留痕迹,在下一次绘制前利用上面的drawColor方法先绘制背景即可(利用背景绘制覆盖痕迹)。
-
设置surfacevie透明
- 借助于下面代码实现surfaceview的透明:
setZOrderOnTop(true);//设置画布 背景透明
sh.setFormat(PixelFormat.TRANSLUCENT);
// 绘制透明背景
canvas.drawColor(Color.TRANSPARENT,
android.graphics.PorterDuff.Mode.CLEAR);
- surfaceview透明和view层级结构
- 上面代码可以设置surfaceview透明,但是存在一个问题就是将surfaceview置顶到当前页面的最顶层,页面其他view都在surfaceview的下面。
- 上面问题解决可以通过下面方法:
- 页面设计层面解决,借助于帧布局等布局方式让其其他view不在surfaceview上层。
- 弹窗之类view不要以 view的方式实现而是以dialog的方式实现。
- 使用api(setZOrderMediaOverlay)代替api(setZOrderOnTop),此时能够保证surfaceview的层级结构,实测发现此api不能实现surfaceview的透明(可能方式不对,有熟悉者麻烦告知)
- 使用surfaceview需要注意的事
- surfaceview黑屏:surfaceview支持双buffer缓存,当某一个buffer为空的时候就会出现黑屏,解决方法:unlockcancvs前校验buffer是否为空。
- surfaceview空指针崩溃:切换页面或者返回键,home键退出页面都有可能造成崩溃,崩溃原因是页面销毁移除surfaceview,surfaceholder跟着移除,此时就会出现空指针,解决方法:
* 线程执行添加boolean值控制,destroy的时候设置为false,避免sv移除后还在继续执行。- 在drawview无论计算还是绘制都加上surfaceholder的判空处理。
- surfaceview home键暂停执行:
- home键短暂退出,通常情况下暂停执行,重新回到页面后继续执行,此场景存在两种:一是home键回到后台短时间回到前台,进程没有被回收此时在需求业务逻辑中加上暂停继续逻辑即可,在home键的监听中设置其暂停即可,二是回到后台后进程被回收,此时雷同于返回键直接走返回键逻辑即可。











网友评论