SurfaceView的基础使用
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的基础使用相关推荐
- Android SurfaceView 黑背景的处理方法
SurfaceView 绘制的时候出现黑背景的如下 或者如下 处理方法就是添加 //画布透明处理this.setZOrderOnTop(true);this.mSurfaceHolder.setFor ...
- SurfaceView、GLSurfaceView、SurfaceTexture、TextureView简单对比
关键字 View SurfaceView GLSurfaceView TextureView 这三个后缀都是View, 所以这三个东西都是用来显示的, 和普通的View差不多, 类似TextView等 ...
- Android 视频展示控件之 SurfaceView、GLSurfaceView、SurfaceTexture、TextureView 对比总结...
一.SurfaceView SurfaceView继承自View,并提供了一个独立的绘图层,你可以完全控制这个绘图层,比如说设定它的大小,所以SurfaceView可以嵌入到View结构树中,需要注意 ...
- Android开发 之 直播视频技术探究之---基础知识大纲介绍
一.前言 最近各种视频直播app到处都是,各种霸屏,当然我们也是需要体验的,关于视频直播的软件这里就不介绍了,在不是技术的人来看,直播是一种潮流,是一种娱乐方式,但是作为一个高技术的,我们除了看看,更 ...
- Android 视频基础知识大纲
一.前言 最近各种视频直播app到处都是,各种霸屏,当然我们也是需要体验的,关于视频直播的软件这里就不介绍了,在不是技术的人来看,直播是一种潮流,是一种娱乐方式,但是作为一个高技术的,我们除了看看,更 ...
- Android中直播视频技术探究之---基础知识大纲介绍
该博客转载于猿是一种能够改变世界的动物!! 一.前言 最近各种视频直播app到处都是,各种霸屏,当然我们也是需要体验的,关于视频直播的软件这里就不介绍了,在不是技术的人来看,直播是一种潮流,是一种娱乐 ...
- Android之使用SurfaceView制作简易写字板
有人说SurfaceView是View的孪生兄弟,其实SurfaceView也是继承自View的,不过View的绘制只能在主线程,而SurfaceView却可以在子线程中进行绘制.本文我们不介绍Sur ...
- 用Canvas在SurfaceView上绘制一个雷达扫描动画
用Canvas在SurfaceView上绘制一个雷达扫描动画 目录 用Canvas在SurfaceView上绘制一个雷达扫描动画 目录 为什么选择SurfaceView 准备工作 构建MySurfac ...
- SurfaceView、GLSurfaceView、SurfaceTexture、TextureView、SurfaceHolder、Surface
SurfaceView.GLSurfaceViewe\SurfaceTexture.TextureView.SurfaceHolder.Surface 一.简介 SurfaceTexture: Sur ...
最新文章
- json字符串的理解
- Reverse Integer
- tensorflow中tf.random_normal和tf.truncated_normal的区别
- 不同寻址方式的灵活应用——改变每个单词首字母大小写
- 有没有高效的记视频笔记方法?--天若OCR文字识别记视频笔记
- 高版本JDK13新特性以及与JDK8对比
- Redis 五种数据类型
- 360手机浏览器升级至chrome62 成内核版本最高的手机浏览器
- 51nod1363 最小公倍数之和
- MongoError: E11000 duplicate key error collection: blog.users index: email_1 dup key
- 分段式多级离心泵_D型卧式多级泵结构组成及工作原理
- 整数、区间与区间端点(三)
- 国内maven镜像,快的飞起
- VBA实现Excel模块筛选高级应用场景!
- 开发计算机新功能,Tablet PC 开发的新增功能
- USACO3.4 “破锣摇滚”乐队 Raucous Rockers - DP
- EfficientDeRainy:一种高效的图像去雨雾算法
- 【Python】在Windows 10 中,安装django-bootstrap-modal-forms
- C# dataGridView控件单元格底色 dataGridView背景色 背景色调整 Header背景色前景色
- CMDB资产管理系统
热门文章
- 云计算,CDN与光速极限
- 数据结构课程设计-——文章编辑(C语言编写)
- 横空出世,比 Visio 快 10 倍的画图工具来了
- IDEA中Mybatis的MGB使用,逆向工程配置。
- 生产者消费者条件变量模型
- 解决方案资源管理器不见了的解决办法
- BBSXP论坛手工得到用户md5密码的方法
- C++ 错误 prototype for ... does not match any in class
- 计算机休眠后无法唤醒出现蓝屏,win10系统下休眠后唤醒出现蓝屏0x000001c7如何解决...
- springcloud 学习项目