Android经典面试题之SurfaceView和TextureView有什么区别?

简介: 分享了`SurfaceView`和`TextureView`在Android中的角色。`SurfaceView`适于视频/游戏,独立窗口低延迟,但变换受限;`TextureView`支持复杂变换,视图层级中渲染,适合动画/视频特效,但性能略低。两者在性能、变换、使用和层级上有差异,开发者需按需选择。

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点

SurfaceViewTextureView 是 Android 应用开发中用于显示内容的两种常用视图,尤其是在需要呈现视频或其他图形内容时。理解它们的作用和区别对于在不同场景下选择合适的视图非常重要。

SurfaceView

作用

  • SurfaceView 提供了一种将内容直接绘制到屏幕上的方式,主要用于高效显示频繁更新的内容,比如视频、游戏图形等。

特点

  • 默认在独立的窗口(Surface)中绘制SurfaceView 创建一个独立的窗口,通过一个独立的 Surface 进行绘制,绘制过程和主线程分离,减少卡顿。
  • 较低延迟:由于 SurfaceView 使用独立的表面,它的绘制操作会更加顺畅高效,适合需要高帧率的场景。
  • 不支持变换(Translation、Rotation 等):SurfaceView 不支持像普通视图一样进行移动、缩放、旋转等变换操作,因为这些操作需要从根本上重排独立的 Surface

使用场景

  • 视频播放
  • 高性能游戏图形渲染
val surfaceView = findViewById<SurfaceView>(R.id.surfaceView)
val holder = surfaceView.holder

holder.addCallback(object : SurfaceHolder.Callback {
    override fun surfaceCreated(holder: SurfaceHolder) {
        // 开始绘制
    }

    override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) {
        // 处理更改
    }

    override fun surfaceDestroyed(holder: SurfaceHolder) {
        // 停止绘制
    }
})

TextureView

作用

  • TextureView 是一个显示内容的控件,可以在其内容上进行复杂的视图变换,如缩放、旋转等。TextureView 渲染的内容会在视图层次中作为纹理进行处理。

特点

  • 呈现在视图层级中:相比于 SurfaceViewTextureView 的内容是在正常的视图层次中进行绘制,允许多层视图叠加和变换效果。
  • 支持变换TextureView 支持视图的常见变换操作(Translation、Rotation、Scale 等),适合在需要动画和变换效果的场景下使用。
  • 有一定性能开销:由于其内容在视图层级中作为纹理处理,导致它的性能相对 SurfaceView 有所下降,但仍然适用于大多数动态内容需求。

使用场景

  • 视频播放需要特效变换(例如旋转、缩放)
  • 动画内容
  • 拍照、视频录制时的取景预览
val textureView = findViewById<TextureView>(R.id.textureView)
textureView.surfaceTextureListener = object : TextureView.SurfaceTextureListener {
    override fun onSurfaceTextureAvailable(surface: SurfaceTexture, width: Int, height: Int) {
        // 开始绘制
    }

    override fun onSurfaceTextureSizeChanged(surface: SurfaceTexture, width: Int, height: Int) {
        // 处理尺寸变化
    }

    override fun onSurfaceTextureDestroyed(surface: SurfaceTexture): Boolean {
        return true // 返回true表示SurfaceTexture将被释放
    }

    override fun onSurfaceTextureUpdated(surface: SurfaceTexture) {
        // 更新绘制内容
    }
}

主要区别

1、 性能差异

  • SurfaceView 利用独立的 Surface 进行渲染,性能较高,适合对延迟和帧率要求高的场景。
  • TextureView 在视图层级中作为纹理处理,性能稍逊,但提供更多视图操作灵活性。

2、 视图变换

  • SurfaceView 不支持常见的视图变换操作(如旋转、缩放),只能随整个窗体一同进行变换。
  • TextureView 支持所有视图变换操作,适合需要变换和动画的内容。

3、 使用方式

  • SurfaceView 需要通过 SurfaceHolder 进行管理和绘制。
  • TextureView 通过 SurfaceTexture 进行管理,较为简单和灵活。

4、 视图层级

  • SurfaceView 的内容会穿透整个视图层级,可能导致其上层盖的其他控件看不到。
  • TextureView 的内容在正常视图层级中,可以进行叠加和变换。

在具体应用中,开发者需要根据性能需求、视图变换需求和视图层级管理的需求选择合适的视图控件。


欢迎关注我的公众号AntDream查看更多精彩文章!

目录
相关文章
|
2天前
|
安全 Android开发 Kotlin
Android经典实战之SurfaceView原理和实践
本文介绍了 `SurfaceView` 这一强大的 UI 组件,尤其适合高性能绘制任务,如视频播放和游戏。文章详细讲解了 `SurfaceView` 的原理、与 `Surface` 类的关系及其实现示例,并强调了使用时需注意的线程安全、生命周期管理和性能优化等问题。
21 7
|
9天前
Android.mk(makefile)中几个符号的区别:=、 :=、 ?=、 +=
本文解释了在Android.mk文件中使用的几种赋值符号的区别,包括`=`(基本赋值)、`:=`(覆盖赋值)、`?=`(条件赋值,仅在变量未赋值时操作)、`+=`(追加赋值),并通过实验演示了这些符号的具体行为和效果。
56 1
|
17天前
|
Java
【Java集合类面试二十八】、说一说TreeSet和HashSet的区别
HashSet基于哈希表实现,无序且可以有一个null元素;TreeSet基于红黑树实现,支持排序,不允许null元素。
|
17天前
|
Java
【Java集合类面试二十三】、List和Set有什么区别?
List和Set的主要区别在于List是一个有序且允许元素重复的集合,而Set是一个无序且元素不重复的集合。
|
17天前
|
存储 Java 索引
【Java集合类面试二十四】、ArrayList和LinkedList有什么区别?
ArrayList基于动态数组实现,支持快速随机访问;LinkedList基于双向链表实现,插入和删除操作更高效,但占用更多内存。
|
18天前
|
Java
【Java基础面试二十三】、==和equals()有什么区别?
这篇文章区分了Java中的`==`运算符和`equals()`方法:`==`用于基本数据类型时比较值是否相等,用于引用类型时比较内存地址是否相同;而`equals()`默认实现按内存地址比较,但通常被重写以根据对象内容比较是否相等。
【Java基础面试二十三】、==和equals()有什么区别?
|
18天前
|
Java
【Java基础面试十八】、说一说重写与重载的区别
这篇文章阐述了Java中重写与重载的区别:重载是同一个类中方法名相同但参数列表不同的方法之间的关系,而重写是子类中方法与父类中相同方法名和参数列表的方法之间的关系,且子类的返回值应小于等于父类,访问修饰符应大于等于父类。
【Java基础面试十八】、说一说重写与重载的区别
|
17天前
|
Java
【Java集合类面试二十二】、Map和Set有什么区别?
该CSDN博客文章讨论了Map和Set的区别,但提供的内容摘要并未直接解释这两种集合类型的差异。通常,Map是一种键值对集合,提供通过键快速检索值的能力,而Set是一个不允许重复元素的集合。
|
17天前
|
存储 Java
【Java集合类面试七】、 JDK7和JDK8中的HashMap有什么区别?
JDK7中的HashMap使用数组加链表解决冲突,而JDK8增加了红黑树结构以优化链表过长时的性能,提高查找效率。
|
17天前
|
安全 Java
【Java集合类面试十五】、说一说HashMap和HashTable的区别
HashMap和Hashtable的主要区别在于Hashtable是线程安全的,不允许null键和值,而HashMap是非线程安全的,允许null键和值。
下一篇
DDNS