46

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

4

6 回答 6

17

纹理视图

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

于 2013-06-04T11:48:28.617 回答
11

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

当您想要更多地控制单个绘图板时,请选择SurfaceView

  • 您不能叠加两个SurfaceView.

TextureView具有以下优点SurfaceView

  • 您可以对TextureView.
于 2016-01-30T09:43:31.883 回答
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
    }

希望它可以帮助开发视频播放器应用程序的人:)

于 2018-10-08T07:17:38.520 回答
0

在视频播放方面,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 文档中的选择表面类型部分

于 2021-10-01T08:01:15.007 回答
0

Surfaceview并且TextureView可以用于从另一个线程

Surfaceview

  • 与 UI 元素绑定使用时具有更好的性能
  • 更少的内存

TextureView

  • API 14
  • 没有创建单独的窗口(与 Surfaceview 不同),这就是为什么 alpha、旋转、移动、变换、动画效果更好的原因
  • 在硬件加速模式内使用
于 2020-12-22T12:10:33.947 回答
0

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

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

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

于 2021-01-01T09:31:30.897 回答