Surfaceview 和 TextureView 有什么区别?

问题描述 投票:0回答:6

一直在研究Android尤其是View系统。 我对它们之间的差异有疑问,但没有我母语的文件或参考资料。所以我想从你们那里知道。

android surfaceview
6个回答
17
投票

TextureView

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.wiscells.com/2012/06/04/surface-view-android/

文件:
http://developer.android.com/reference/android/view/SurfaceView.html


10
投票

SurfaceView
TextureView
都是继承自android.view.View类。 然而,它们之间存在一些结构差异。

当你想要更多地控制单个绘图板时,去

SurfaceView

  • 你不能叠加两个
    SurfaceView
    .

TextureView
相对于
SurfaceView
有以下优点:

  • 您可以制作动画、变换和缩放
    TextureView
    .

5
投票

除了其他答案,这可能对新手 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
    }

希望对开发视频播放器应用的人有所帮助:)


2
投票

谈到视频播放,

SurfaceView
而不是
TextureView
。有一些重要的区别:

  • TextureViews 表现得像普通视图。 SurfaceViews 没有。一个 SurfaceView 有 UI 中的透明“孔”,独立的 Surface 层可以通过该孔 可见。这个 Surface 被直接发送到系统图形合成器。
  • 因为系统合成器正在将视频与UI合成, 而不是应用程序,它通常可以更有效地完成(例如使用 硬件作曲家“覆盖”)。这可以显着节省电池电量 播放长电影时。
  • 另一方面,TextureView 内容可以自由缩放和旋转 用一个简单的矩阵。 SurfaceView 输出仅限于缩放,而且它是 做起来更尴尬。
  • 应用程序(甚至系统合成器)无法触及受 DRM 保护的内容。 我们必须将 MediaCodec 解码器指向由 硬件作曲家覆盖。做这件事的应用程序方面的唯一方法是 表面视图。

MediaCodec 解码器从 Surface 请求缓冲区,传递 作为参数的视频尺寸。 Surface 提供缓冲区 一个匹配的大小,这意味着视频数据将完全覆盖 表面。结果,没有必要使用 SurfaceHolder#setFixedSize() 设置尺寸。五金件 缩放器将缩放视频以匹配视图大小,所以如果我们想 保留我们需要调整视图布局的正确纵横比。 为此,我们可以使用自定义的 AspectFrameLayout。实际上 视频的播放——将帧发送到 Surface——是一样的 用于 TextureView 和 SurfaceView。

通读 Choosing a surface type section in exoplayer documentation for further.


1
投票

SurfaceView 采用与其他视图相同的参数,但 SurfaceView 内容在呈现时是透明的。

TextureView 比 SurfaceView 具有更好的 alpha 和旋转处理,但 SurfaceView 在合成分层在视频上的 UI 元素时具有性能优势。

更多信息:https://source.android.com/devices/graphics/arch-tv


1
投票

Android SurfaceView 与 TextureView

SurfaceView
TextureView
可用于从另一个线程

Surfaceview

  • 更好的性能与 UI 元素结合使用
  • 更少的内存占用

TextureView

  • API 14
  • 没有创建单独的窗口(不像 Surfaceview),这就是为什么 alpha、旋转、移动、变换、动画更好
  • 在硬件加速模式下使用
© www.soinside.com 2019 - 2024. All rights reserved.