我一直在研究Android,尤其是View系统。我对它们之间的差异有疑问,但我的母语没有文件或参考资料。所以我想从你们那里知道。
6 回答
纹理视图
TextureView 可用于显示内容流。例如,这样的内容流可以是视频或 OpenGL 场景。
示例:
https ://github.com/dalinaum/TextureViewDemo
文档:http:
//developer.android.com/reference/android/view/TextureView.html
表面视图
提供嵌入在视图层次结构中的专用绘图表面。
示例: http:
//www.mindfiresolutions.com/Using-Surface-View-for-Android-1659.php
http://blog.wisecells.com/2012/06/04/surface-view-android/
文档:http:
//developer.android.com/reference/android/view/SurfaceView.html
SurfaceView
两者TextureView
都继承自 android.view.View 类。但是,它们之间存在一些结构差异。
当您想要更多地控制单个绘图板时,请选择SurfaceView
- 您不能叠加两个
SurfaceView
.
TextureView
具有以下优点SurfaceView
:
- 您可以对
TextureView
.
除了其他答案之外,这可能对新手 android 开发人员或任何会看到此内容的人有益。
就我而言,在OnCreate
方法中使用此代码段帮助我找出可以使用的设备SurfaceView
if (
GLES20.glGetString(GLES20.GL_RENDERER) == null ||
GLES20.glGetString(GLES20.GL_VENDOR) == null ||
GLES20.glGetString(GLES20.GL_VERSION) == null ||
GLES20.glGetString(GLES20.GL_EXTENSIONS) == null ||
GLES10.glGetString(GLES10.GL_RENDERER) == null ||
GLES10.glGetString(GLES10.GL_VENDOR) == null ||
GLES10.glGetString(GLES10.GL_VERSION) == null ||
GLES10.glGetString(GLES10.GL_EXTENSIONS) == null) {
// try to use SurfaceView
} else {
// try to use TextureView
}
希望它可以帮助开发视频播放器应用程序的人:)
在视频播放方面,SurfaceView
而不是TextureView
. 有一些重要的区别:
- TextureView 的行为类似于普通视图。SurfaceViews 没有。SurfaceView 在 UI 中有一个透明的“洞”,通过它可以看到一个独立的 Surface 层。此 Surface 直接发送到系统图形合成器。
- 因为视频是由系统合成器而不是应用程序与 UI 合成的,所以通常可以更有效地完成(例如,使用硬件合成器“覆盖”)。这可以在播放长电影时显着节省电池电量。
- 另一方面,TextureView 的内容可以用一个简单的矩阵自由缩放和旋转。SurfaceView 输出仅限于缩放,做起来比较尴尬。
- 应用程序(甚至系统合成器)无法触及受 DRM 保护的内容。我们必须将 MediaCodec 解码器指向一个由硬件作曲家覆盖合成的 Surface。应用程序方面的唯一方法是使用 SurfaceView。
MediaCodec 解码器从 Surface 请求缓冲区,将视频尺寸作为参数传入。Surface 提供大小匹配的缓冲区,这意味着视频数据将完全覆盖 Surface。因此,无需使用 SurfaceHolder#setFixedSize() 来设置尺寸。硬件缩放器将缩放视频以匹配视图大小,因此如果我们想保持正确的纵横比,我们需要调整视图布局。我们可以为此使用自定义的 AspectFrameLayout。视频的实际播放——向 Surface 发送帧——对于 TextureView 和 SurfaceView 是相同的。
进一步阅读exoplayer 文档中的选择表面类型部分。
Surfaceview
并且TextureView
可以用于从另一个线程
Surfaceview
- 与 UI 元素绑定使用时具有更好的性能
- 更少的内存
TextureView
- API 14
- 没有创建单独的窗口(与 Surfaceview 不同),这就是为什么 alpha、旋转、移动、变换、动画效果更好的原因
- 在硬件加速模式内使用
SurfaceView 采用与其他视图相同的参数,但 SurfaceView 的内容在渲染时是透明的。
TextureView 比 SurfaceView 具有更好的 alpha 和旋转处理能力,但 SurfaceView 在合成分层在视频上的 UI 元素时具有性能优势。