SurfaceView

继承自View,拥有独立的绘图表面,即不与其宿主窗口共享一个绘图表面,通过Canvas画布绘制
可在另一线程中更新界面,且不阻碍界面交互,不会占用主线程资源

与View区别

SurfaceView
1、子线程中可以重新绘制画面,且绘图效率更高,适合动画等复杂绘制页面
2、每个SurfaceView拥有独立的surface,通过在顶级surface上打洞来显示自己。这些surface对应底层的Layer,由SurfaceFlinger根据这些layer的内容以及层级进行混合并最终显示
3、需通过SurfaceHolder.lockCanvas()主动获取canvas
4、一个SurfaceView拥有一个surface,它只需要对自己进行测量、布局和绘制。流程简单的多
5、实现重绘的方式更直观,每次主动调用doDraw()就是重新绘制
6、使用场景:主动更新画面的,如复杂的动画

View
1、必须在UI的主线程中更新画面
2、通过ViewRootImpl提供的顶级surface进行lockCanvas(Rect dirty),返回的canvas会在指定的dirty范围进行绘制
3、由顶级surface在ViewRootImple就已经lockCanvas后,把canvas传递到View的draw(canvas)
4、只拥有一个顶级surface,子view都是共用一个surface,所以在绘制时performTraversals()是对一个树结构的view群进行测量、布局、绘制的遍历
5、不能直接通过surface.lockCanvas获取canvas,只能通过调用invalidate()去触发父视图ViewRootImpl去调用performTraversal()去实现重绘
6、使用场景:被动更新画面的,如通过点击事件,来对画面进行重绘(invalidate())

Surface与Canvas区别

Surface
surfaceview可见部分,绘图操作(surfaceCreated/Changed/Destroyed,也是SurfaceHolder.Callback的回调,作用于内存区)作用于它
Canvas
绘制操作者,通过surface.lockCanvas(Rect dirty)获得,只能在dirty范围进行对surface指定区域的绘制

基础使用

//布局中放入SurfaceView控件
SurfaceView surfaceView=(SurfaceView)findViewById(R.id.surfaceview);
//获取SurfaceHolder
SurfaceHolder surfaceHolder=(SurfaceHolder) surfaceView.getHolder();
//实现SurfaceHolder.Callback方法
surfaceHolder.addCallback(new SurfaceHolder.Callback(){@Override public void surfaceDestroyed(SurfaceHolder holder) {}@Override public void surfaceCreated(SurfaceHolder holder){//获得canvas的大小并锁定canvasCanvas canvas=holder.lockCanvas();Bitmap bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);canvas.drawBitmap(bitmap, 50, 50,new Paint());//提交更新canvas(可在子线程中进行)holder.unlockCanvasAndPost(canvas);}@Override public void surfaceChanged(SurfaceHolder holder,int format,int width,int height){}
});

问题

为什么可以使用子线程更新画面

view通过ViewRootImpl提供的surface作为顶级surface,所有的View均在其进行绘制
SurfaceView拥有自己独立的surface,由WindowManagerService完成绘制,并以在顶级surface上打洞的形式呈现

SurfaceView的基础使用相关推荐

  1. Android SurfaceView 黑背景的处理方法

    SurfaceView 绘制的时候出现黑背景的如下 或者如下 处理方法就是添加 //画布透明处理this.setZOrderOnTop(true);this.mSurfaceHolder.setFor ...

  2. SurfaceView、GLSurfaceView、SurfaceTexture、TextureView简单对比

    关键字 View SurfaceView GLSurfaceView TextureView 这三个后缀都是View, 所以这三个东西都是用来显示的, 和普通的View差不多, 类似TextView等 ...

  3. Android 视频展示控件之 SurfaceView、GLSurfaceView、SurfaceTexture、TextureView 对比总结...

    一.SurfaceView SurfaceView继承自View,并提供了一个独立的绘图层,你可以完全控制这个绘图层,比如说设定它的大小,所以SurfaceView可以嵌入到View结构树中,需要注意 ...

  4. Android开发 之 直播视频技术探究之---基础知识大纲介绍

    一.前言 最近各种视频直播app到处都是,各种霸屏,当然我们也是需要体验的,关于视频直播的软件这里就不介绍了,在不是技术的人来看,直播是一种潮流,是一种娱乐方式,但是作为一个高技术的,我们除了看看,更 ...

  5. Android 视频基础知识大纲

    一.前言 最近各种视频直播app到处都是,各种霸屏,当然我们也是需要体验的,关于视频直播的软件这里就不介绍了,在不是技术的人来看,直播是一种潮流,是一种娱乐方式,但是作为一个高技术的,我们除了看看,更 ...

  6. Android中直播视频技术探究之---基础知识大纲介绍

    该博客转载于猿是一种能够改变世界的动物!! 一.前言 最近各种视频直播app到处都是,各种霸屏,当然我们也是需要体验的,关于视频直播的软件这里就不介绍了,在不是技术的人来看,直播是一种潮流,是一种娱乐 ...

  7. Android之使用SurfaceView制作简易写字板

    有人说SurfaceView是View的孪生兄弟,其实SurfaceView也是继承自View的,不过View的绘制只能在主线程,而SurfaceView却可以在子线程中进行绘制.本文我们不介绍Sur ...

  8. 用Canvas在SurfaceView上绘制一个雷达扫描动画

    用Canvas在SurfaceView上绘制一个雷达扫描动画 目录 用Canvas在SurfaceView上绘制一个雷达扫描动画 目录 为什么选择SurfaceView 准备工作 构建MySurfac ...

  9. SurfaceView、GLSurfaceView、SurfaceTexture、TextureView、SurfaceHolder、Surface

    SurfaceView.GLSurfaceViewe\SurfaceTexture.TextureView.SurfaceHolder.Surface 一.简介 SurfaceTexture: Sur ...

最新文章

  1. json字符串的理解
  2. Reverse Integer
  3. tensorflow中tf.random_normal和tf.truncated_normal的区别
  4. 不同寻址方式的灵活应用——改变每个单词首字母大小写
  5. 有没有高效的记视频笔记方法?--天若OCR文字识别记视频笔记
  6. 高版本JDK13新特性以及与JDK8对比
  7. Redis 五种数据类型
  8. 360手机浏览器升级至chrome62 成内核版本最高的手机浏览器
  9. 51nod1363 最小公倍数之和
  10. MongoError: E11000 duplicate key error collection: blog.users index: email_1 dup key
  11. 分段式多级离心泵_D型卧式多级泵结构组成及工作原理
  12. 整数、区间与区间端点(三)
  13. 国内maven镜像,快的飞起
  14. VBA实现Excel模块筛选高级应用场景!
  15. 开发计算机新功能,Tablet PC 开发的新增功能
  16. USACO3.4 “破锣摇滚”乐队 Raucous Rockers - DP
  17. EfficientDeRainy:一种高效的图像去雨雾算法
  18. 【Python】在Windows 10 中,安装django-bootstrap-modal-forms
  19. C# dataGridView控件单元格底色 dataGridView背景色 背景色调整 Header背景色前景色
  20. CMDB资产管理系统

热门文章

  1. 云计算,CDN与光速极限
  2. 数据结构课程设计-——文章编辑(C语言编写)
  3. 横空出世,比 Visio 快 10 倍的画图工具来了
  4. IDEA中Mybatis的MGB使用,逆向工程配置。
  5. 生产者消费者条件变量模型
  6. 解决方案资源管理器不见了的解决办法
  7. BBSXP论坛手工得到用户md5密码的方法
  8. C++ 错误 prototype for ... does not match any in class
  9. 计算机休眠后无法唤醒出现蓝屏,win10系统下休眠后唤醒出现蓝屏0x000001c7如何解决...
  10. springcloud 学习项目