美文网首页
surfaceview初学

surfaceview初学

作者: 爱你为你做饭 | 来源:发表于2021-08-02 15:47 被阅读0次
  1. 什么是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的区别:


      区别
  2. surfaceview的三要素,特别注意surfaceview和surfaceholder通过callback串联系统才能执行surfaceview

    • surfaceview三要素:surfaceview,surfaceholder,callback。
    • surfaceview:主体,是surfaceview的核心实现,surfaceholder可以看作surfaceview的管理者,使用者不是直接使用surfaceview而是通过surfaceholder去操作surfaceview,callback则是surfaceview和surfaceholder的桥梁,串联了两者,callback声明了create,change,destroy三个回调方法,也表明了surfaceview的生命周期。
  3. surfaceview使用流程(简要描述)

    • surfaceview的使用通常借助于线程进行异步绘制,代码结构上通常可以封装代码模板。
    • 继承surfaceview并实现callback和runnable
    • 获取surfaceview的viewholder并添加callback串联两者
    • 声明boolean值在create和destroy中控制开和闭,控制线程中的计算和绘制
    • create中创建线程并启动线程
    • runnable的实现run方法中进行计算和绘制并计算合适的刷新频率(借助于线程的睡眠时间实现)
  4. surfaceview如何设置view背景

    • 获取到canvas通过drawColor的方法设置其背景即可,不可以像传统view似的通过background设置背景。
  5. surfaceview如何清空view绘制(二级缓存的原因会保留先前的绘制)

    • 二级缓存的原因,surfaceview会保持上一次的绘制痕迹,类似于path的绘制,有时效果可以借助这个特性实现,比如绘制圆的扩散,但是通常下一次绘制不需要保留痕迹。
    • 不保留痕迹,在下一次绘制前利用上面的drawColor方法先绘制背景即可(利用背景绘制覆盖痕迹)。
  6. 设置surfacevie透明

    • 借助于下面代码实现surfaceview的透明:
        setZOrderOnTop(true);//设置画布  背景透明
        sh.setFormat(PixelFormat.TRANSLUCENT);
        // 绘制透明背景
        canvas.drawColor(Color.TRANSPARENT, 
        android.graphics.PorterDuff.Mode.CLEAR);
  1. surfaceview透明和view层级结构
    • 上面代码可以设置surfaceview透明,但是存在一个问题就是将surfaceview置顶到当前页面的最顶层,页面其他view都在surfaceview的下面。
    • 上面问题解决可以通过下面方法:
      • 页面设计层面解决,借助于帧布局等布局方式让其其他view不在surfaceview上层。
      • 弹窗之类view不要以 view的方式实现而是以dialog的方式实现。
      • 使用api(setZOrderMediaOverlay)代替api(setZOrderOnTop),此时能够保证surfaceview的层级结构,实测发现此api不能实现surfaceview的透明(可能方式不对,有熟悉者麻烦告知)
  2. 使用surfaceview需要注意的事
    • surfaceview黑屏:surfaceview支持双buffer缓存,当某一个buffer为空的时候就会出现黑屏,解决方法:unlockcancvs前校验buffer是否为空。
    • surfaceview空指针崩溃:切换页面或者返回键,home键退出页面都有可能造成崩溃,崩溃原因是页面销毁移除surfaceview,surfaceholder跟着移除,此时就会出现空指针,解决方法:
      * 线程执行添加boolean值控制,destroy的时候设置为false,避免sv移除后还在继续执行。
      • 在drawview无论计算还是绘制都加上surfaceholder的判空处理。
    • surfaceview home键暂停执行:
      • home键短暂退出,通常情况下暂停执行,重新回到页面后继续执行,此场景存在两种:一是home键回到后台短时间回到前台,进程没有被回收此时在需求业务逻辑中加上暂停继续逻辑即可,在home键的监听中设置其暂停即可,二是回到后台后进程被回收,此时雷同于返回键直接走返回键逻辑即可。

参考文章:
surfaceview的基本使用
surfaceview详解

相关文章

网友评论

      本文标题:surfaceview初学

      本文链接:https://www.haomeiwen.com/subject/edbakltx.html