一、SurfaceView

SurfaceView继承自View,并提供了一个独立的绘图层,你可以完全控制这个绘图层,比如说设定它的大小,所以SurfaceView可以嵌入到View结构树中,需要注意的是,由于SurfaceView直接将绘图表层绘制到屏幕上,所以和普通的View不同的地方就在与它不能执行Transition,Rotation,Scale等转换,也不能进行Alpha透明度运算。

SurfaceView的Surface排在Window的Surface(也就是View树所在的绘图层)的下面,SurfaceView嵌入到Window的View结构树中就好像在Window的Surface上强行打了个洞让自己显示到屏幕上,而且SurfaceView另起一个线程对自己的Surface进行刷新。需要注意的是SurfaceHolder.Callback的所有回调方法都是在主线程中回调的。

SurfaceView、SurfaceHolder、Surface的关系可以概括为以下几点:

  • SurfaceView是拥有独立绘图层的特殊View。
  • Surface就是指SurfaceView所拥有的那个绘图层,其实它就是内存中的一段绘图缓冲区。
  • SurfaceView中具有两个Surface,也就是我们所说的双缓冲机制
  • SurfaceHolder顾名思义就是Surface的持有者,SurfaceView就是通过过SurfaceHolder来对Surface进行管理控制的。并且SurfaceView.getHolder方法可以获取SurfaceView相应的SurfaceHolder。
  • Surface是在SurfaceView所在的Window可见的时候创建的。我们可以使用SurfaceHolder.addCallback方法来监听Surface的创建与销毁的事件。

Surface的渲染可以放到单独线程去做,渲染时可以有自己的GL context。这对于一些游戏、视频等性能相关的应用非常有益,因为它不会影响主线程对事件的响应。但它也有缺点,因为这个Surface不在View hierachy中,它的显示也不受View的属性控制,所以不能进行平移,缩放等变换,也不能放在其它ViewGroup中,一些View中的特性也无法使用。

二、TextureView

TextureView专门用来渲染像视频或OpenGL场景之类的数据的,而且TextureView只能用在具有硬件加速的Window中,如果使用的是软件渲染,TextureView将什么也不显示。也就是说对于没有GPU的设备,TextureView完全不可用。

TextureView 有两个相关类 SurfaceTexture、Surface,下面说明一下几者相关的特点:

  • Surface就是SurfaceView中使用的Surface,就是内存中的一段绘图缓冲区。
  • SurfaceTexture用来捕获视频流中的图像帧的,视频流可以是相机预览或者视频解码数据。SurfaceTexture可以作为android.hardware.camera2, MediaCodec, MediaPlayer, 和 Allocation这些类的目标视频数据输出对象。可以调用updateTexImage()方法从视频流数据中更新当前帧,这就使得视频流中的某些帧可以跳过。
  • TextureView可以通过getSurfaceTexture()方法来获取TextureView相应的SurfaceTexture。但是最好的方式还是使用TextureView.SurfaceTextureListener监听器来对SurfaceTexture的创建销和毁进行监听,因为getSurfaceTexture可能获取的是空对象。

三、GLSurfaceView

GLSurfaceView作为SurfaceView的补充,可以看作是SurfaceView的一种典型使用模式。在SurfaceView的基础上,它加入了EGL的管理,并自带了渲染线程。另外它定义了用户需要实现的Render接口,提供了用Strategy pattern更改具体Render行为的灵活性。作为GLSurfaceView的Client,只需要将实现了渲染函数的Renderer的实现类设置给GLSurfaceView即可。

四、SurfaceTexture

SurfaceTexture和SurfaceView不同的是,它对图像流的处理并不直接显示,而是转为GL外部纹理,因此可用于图像流数据的二次处理(如Camera滤镜,桌面特效等)。比如Camera的预览数据,变成纹理后可以交给GLSurfaceView直接显示,也可以通过SurfaceTexture交给TextureView作为View heirachy中的一个硬件加速层来显示。首先,SurfaceTexture从图像流(来自Camera预览,视频解码,GL绘制场景等)中获得帧数据,当调用updateTexImage()时,根据内容流中最近的图像更新SurfaceTexture对应的GL纹理对象,接下来,就可以像操作普通GL纹理一样操作它了。

参考文章:

  1. http://blog.csdn.net/holmofy/article/details/66578852
  2. http://blog.csdn.net/Holmofy/article/details/66583879
  3. https://www.cnblogs.com/wytiger/p/5693569.html

最新文章

  1. (一)java arcgis开发环境搭建
  2. zookeeper原理解析-序列化
  3. python知识点总结
  4. 如何将一个Form中的代码拆分到多个文件中
  5. javascript pattern
  6. python处理xml的常用包(lib.xml、ElementTree、lxml)
  7. hdu 4687 Boke and Tsukkomi
  8. java 线程 ProducerAndConsumer
  9. CodeForces 83B Doctor
  10. js放大镜
  11. 修复python的ModuleNotFoundError
  12. Unity快速接入SDK框架
  13. 普通用户授予select any table 权限
  14. css样式关键字(initial,inherit,unset,revert,all)
  15. day 16 - 1 内置函数(二)
  16. cdh zookeeper 不断拒绝连接
  17. H264--2--语法及结构
  18. Android开发怎么让自己的APP UI漂亮、大方(配色篇二)
  19. Linux ifconfig 命令
  20. 压缩归档文件审查工具p7zip-full

热门文章

  1. 解决maven项目Cannot change version of project facet Dynamic web module to 3.0
  2. 理解 Git
  3. Elasticsearch安装使用
  4. Spring data mongodb @CreatedBy@LastModifiedBy@CreatedBy@LastModifiedBy SpringSecurityAuditorAware,只记录用户名
  5. 重装Win10系统的非常简单的操作教程
  6. 前端JS面试题汇总 Part 3 (宿主对象与原生对象/函数调用方式/call与apply/bind/document.write)
  7. HDP2.0测试
  8. Lua Table转C# Dictionary
  9. 重温.NET下Assembly的加载过程
  10. 经典案例之MouseJack