1、关于 SurfaceView 和 TextureView
1.1 基础
SurfaceView 以及 TextureView 均继承于 android.view.View
,属于 Android 提供的控件体系的一部分。与普通 View 不同,它们都在独立的线程中绘制和渲染。所以,相比于普通的 ImageView 它们的性能更高,因此常被用在对绘制的速率要求比较高的应用场景中,用来解决普通 View 因为绘制的时间延迟而带来的掉帧的问题,比如用作相机预览、视频播放的媒介等。
相比于普通的 View,SurfaceView 有以下几点优势:
- SurfaceView 适用于主动刷新,普通的 View 无法进行主动刷新;
- SurfaceView 通过子线程来更新画面,而普通的 View 需要在主线程中更新画面;
- 最后就是缓冲的问题,普通的 View 不存在缓存机制,而 SurfaceView 存在缓冲机制。
1.2 两种控件的基础使用
1.2.1 TextureView 的使用
TextureView 在 API 14
中引入,用来展示流,比如视频和 OpenGL 等的流。这些流可以来自应用进程或者是跨进程的。它只能用在开启了硬件加速的窗口,否则无法绘制任何内容。与 SurefaceView 不同,TextureView 不会创建一个独立的窗口,而是像一个普通的 View 一样。这种区别使得 TextureView 可以移动、转换和做动画等,比如你可以使用 TextureView 的 setAlpha() 方法将其设置成半透明的。
TextureView 的使用非常简单,你只需要获取到它的 SurfaceTexture. 然后就可以使用它来渲染。下面的示例说明了如何使用 TextureView 作为相机的预览控件,
class TextureViewActivity : CommonActivity<ActivityTextureViewBinding>(), TextureView.SurfaceTextureListener {
private lateinit var camera: Camera
private lateinit var textureView: TextureView
override fun getLayoutResId(): Int = R.layout.activity_texture_view
override fun doCreateView(savedInstanceState: Bundle?) {
textureView = TextureView(