1、SurfaceView是什么

它继承自类View,因此它本质上是一个View。但与普通View不同的是,它有自己的Surface。有自己的Surface,在WMS中有对应的WindowState,在SurfaceFlinger中有Layer。我们知道,一般的Activity包含的多个View会组成View hierachy的树形结构,只有最顶层的DecorView,也就是根结点视图,才是对WMS可见的。这个DecorView在WMS中有一个对应的WindowState。相应地,在SF中对应的Layer。

而SurfaceView自带一个Surface,这个Surface在WMS中有自己对应的WindowState,在SF中也会有自己的Layer。虽然在App端它仍在View hierachy中,但在Server端(WMS和SF)中,它与宿主窗口是分离的。这样的好处是对这个Surface的渲染可以放到单独线程去做,渲染时可以有自己的GL context。这对于一些游戏、视频等性能相关的应用非常有益,因为它不会影响主线程对事件的响应。

但它也有缺点,因为这个Surface不在View hierachy中,它的显示也不受View的属性控制,所以不能进行平移,缩放等变换,也不能放在其它ViewGroup中,一些View中的特性也无法使用。

2、SurfaceView优缺点

优点:

可以在一个独立的线程中进行绘制,不会影响主线程

使用双缓冲机制,播放视频时画面更流畅

缺点:

Surface不在View hierachy中,它的显示也不受View的属性控制,所以不能进行平移,缩放等变换,也不能放在其它ViewGroup中。SurfaceView 不能嵌套使用。

3、SurfaceView双缓冲

双缓冲:在运用时可以理解为:SurfaceView在更新视图时用到了两张Canvas,一张frontCanvas和一张backCanvas,每次实际显示的是frontCanvas,backCanvas存储的是上一次更改前的视图,当使用lockCanvas()获取画布时,得到的实际上是backCanvas而不是正在显示的frontCanvas,之后你在获取到的backCanvas上绘制新视图,再unlockCanvasAndPost(canvas)此视图,那么上传的这张canvas将替换原来的frontCanvas作为新的frontCanvas,原来的frontCanvas将切换到后台作为backCanvas。例如,如果你已经先后两次绘制了视图A和B,那么你再调用lockCanvas()获取视图,获得的将是A而不是正在显示的B,之后你将重绘的C视图上传,那么C将取代B作为新的frontCanvas显示在SurfaceView上,原来的B则转换为backCanvas。

4、TextureView是什么

在4.0(API level 14)中引入,与SurfaceView一样继承View,它可以将内容流直接投影到View中,可以用于实现Live preview等功能。

和SurfaceView不同,它不会在WMS中单独创建窗口,而是作为View hierachy中的一个普通View,因此可以和其它普通View一样进行移动,旋转,缩放,动画等变化。

值得注意的是TextureView必须在硬件加速的窗口中。它显示的内容流数据可以来自App进程或是远端进程。

从类图中可以看到,TextureView继承自View,它与其它的View一样在View hierachy中管理与绘制。TextureView重载了draw()方法,其中主要SurfaceTexture中收到的图像数据作为纹理更新到对应的HardwareLayer中。

SurfaceTexture.OnFrameAvailableListener用于通知TextureView内容流有新图像到来。SurfaceTextureListener接口用于让TextureView的使用者知道SurfaceTexture已准备好,这样就可以把SurfaceTexture交给相应的内容源。Surface为BufferQueue的Producer接口实现类,使生产者可以通过它的软件或硬件渲染接口为SurfaceTexture内部的BufferQueue提供graphic buffer。

5、TextureView优点及缺点

优点:

支持移动、旋转、缩放等动画,支持截图

缺点:

必须在硬件加速的窗口中使用,占用内存比SurfaceView高,在5.0以前在主线程渲染,5.0以后有单独的渲染线程。

6、两者比较

7、播放器选谁

从性能和安全性角度出发,使用播放器首选SurfaceView。

最后,总结下这几者的区别和联系。简单地说:

SurfaceView是一个有自己独立Surface的View, 它的渲染可以放在单独线程而不是主线程中, 其缺点是不能做变形和动画。

SurfaceTexture可以用作非直接输出的内容流,这样就提供二次处理的机会。与SurfaceView直接输出相比,这样会有若干帧的延迟。同时,由于它本身管理BufferQueue,因此内存消耗也会稍微大一些。

TextureView是一个可以把内容流作为外部纹理输出在上面的View, 它本身需要是一个硬件加速层。

事实上TextureView本身也包含了SurfaceTexture, 它与SurfaceView+SurfaceTexture组合相比可以完成类似的功能(即把内容流上的图像转成纹理,然后输出), 区别在于TextureView是在View hierachy中做绘制,因此一般它是在主线程上做的(在Android 5.0引入渲染线程后,它是在渲染线程中做的)。而SurfaceView+SurfaceTexture在单独的Surface上做绘制,可以是用户提供的线程,而不是系统的主线程或是渲染线程。另外,与TextureView相比,它还有个好处是可以用Hardware overlay进行显示。

SurfaceView及TextureView区别相关推荐

  1. Android SurfaceView、TextureView区别

    SurfaceView是一个有自己独立Surface的View, 它的渲染可以放在单独线程而不是主线程中, 其缺点是不能做变形和动画.继承:MockView SurfaceTexture可以用作非直接 ...

  2. SurfaceView和TextureView的使用以及区别

    SurfaceView和TextureView的使用以及区别 一 . 什么时候使用SurfaceView 我们平时学习自定义view的过程中会发现自定义的View可以满足大部分的绘图需求,但是当我们需 ...

  3. SurfaceView 与 TextureView 详解

    前言 播放视频或者渲染其他的动画的时候,有两个 View 组件可供选择,SurfaceView 和 TextureView,GLSurfaceView 是 SurfaceView 的子类,在 Surf ...

  4. 浅谈 SurfaceView、TextureView、GLSurfaceView、SurfaceTexture

    一.SurfaceView SurfaceView 是一个可以在子线程中更新 UI 的 View,且不会影响到主线程.它为自己创建了一个窗口(window),就好像在视图层次(View Hierarc ...

  5. Android openGl开发详解(二)——通过SurfaceView,TextureView,GlSurfaceView显示相机预览(附Demo)

    最近公司在做自定义相机这一块,之前使用的是第三方,后来需求变更,第三方不支持添加动态贴纸,所以只能自己扩展.当然网上有很多例子,但是关于添加动态贴纸的例子几乎找不到,反正我是没找到(欲哭无泪).当然, ...

  6. surfaceView和View区别

    surfaceView和View最本质的区别在于:  ------------------------------------------------------------------------- ...

  7. SurfaceView,TextureView,SurfaceTexture相关

    首先我们知道View类如果需要更新视图,必须我们主动的去调用invalidate()或者postInvalidate()方法来再走一次onDraw()完成更新.但是呢,Android系统规定屏幕的刷新 ...

  8. 安卓中的View、SurfaceView和GLSurfaceView区别

    Android游戏当中主要的除了控制类外就是显示类View:SurfaceView是从View基类中派生出来的显示类.android游戏开发中常用的三种视图是:view.SurfaceView和GLS ...

  9. GLSurfaceView 与 SurfaceView 联系与区别

    同系列文章: SurfaceView为什么不能做动画? SurfaceView+MediaPlayer实现视频播放 本文目录 笔试题解析 有了SurfaceView,为什么还要提供一个GLSurfac ...

最新文章

  1. pytorch中tensor的unsqueeze()函数和squeeze()函数的用处
  2. 《Java 核心技术卷1 第10版》学习笔记------ 接口(Interface)
  3. 单点登录系统和CAS的简介
  4. 使用Apache Cassandra设置一个SpringData项目
  5. 06-04 Jenkins 权限控制
  6. 入门 RISC-V 编程的五大技巧
  7. 福利 | 干大事,成大事,2018 幸福如是!
  8. 分离圆环图显示百分比_excel这个百分比图,你不一定会制作
  9. (转载)排序六 堆排序
  10. 史上最全40道dubbo面试题
  11. vasp和ms_武汉理工大学赵焱课题组开发脚本 MS建模一键获取VASP输入文件POSCAR
  12. html安装网卡驱动,教您怎么用驱动精灵安装网卡驱动
  13. matlab2016 wavread,matlab 7.10里面的wavread函数不能打开.wav文件。我的wav文件是电脑自带的录音机录的...
  14. 上热搜!武大学生用Python敲出樱花开放 | 附源码
  15. android学习笔记之——获取SD卡及手机ROM容量
  16. Vue-2-计算属性、侦听器、过滤器、样式绑定
  17. 揭秘Google排名的60个因素
  18. 部署在IIS上的网站返回错误码 “405”解决方案
  19. sqlserver数据库同步更新数据到mysql数据库,利用ODBC
  20. C# 汉字转拼音首字母大写

热门文章

  1. ##二维数组指针的解引用
  2. MySQL操作之视图
  3. 小程序:获取当前周数,年份和月份
  4. Android中使用ImageLoader加载图片
  5. Java实现视频转码 mp4文件转编码集
  6. Ode45以及龙格-库塔算法
  7. 【微信小程序】全局样式、局部样式、全局配置
  8. 通过微软实习面试......
  9. 博客系统(页面设计)
  10. Ajax-应用:实现分页