Skip to content
阅读进度

SurfaceView 与 TextureView 有什么区别? ​

返回 View 与显示链路 目录

标准回答 ​

普通 TextView、Button 通常绘制到所在窗口的内容中;SurfaceView 为内容提供独立 Surface,可由相机、解码器或渲染器生产图像,再进入系统合成;TextureView 则通过 SurfaceTexture 消费图像,把它作为纹理纳入 View 的硬件加速渲染。

SurfaceView 的内容生产能够与普通 View 绘制分开,常用于视频和相机等场景;TextureView 更接近普通 View 的变换与混合方式,但可能带来额外的渲染或合成成本。选择要看内容来源、效果、硬件能力与系统版本,不能简单等同于谁永远更快。

两者都有内容目标的生命周期。Activity 已经 onResume,不代表 Surface 已可用;Surface 销毁或更换后,旧的输出绑定也不能继续当作有效。页面切换后黑屏,需要确认生产者向哪个目标输出,以及消费者是否已经准备好。

现代系统不断改进 SurfaceView 的同步、变换和透明度行为,所以“SurfaceView 永远不能做动画、永远不能透明”这类绝对结论不可靠。先掌握独立 Surface 与 View 树纹理这一区别,再核对目标版本的具体能力。

关键机制 ​

  • TextView 等普通 View 主要绘制到所在窗口的目标;SurfaceView 不只是一个“更快的 TextView”。
  • Surface 的创建、尺寸变化和销毁有独立回调,Activity 可见不代表 Surface 一定已经可用。
  • 选择要结合播放器、相机、变换需求、性能和系统版本;平台演进会改变部分限制,不能只背绝对结论。

通俗例子 ​

播放器切换页面后黑屏,可能是仍向旧 Surface 渲染。新 Surface 就绪后重新绑定,旧 Surface 销毁时停止相应输出。

追问与回答 ​

SurfaceView 一定要自己开线程画吗? ​

不一定。SurfaceView 提供 Surface,内容可以由你的绘图线程生产,也可以由相机或 MediaCodec 等组件直接输出。关键是生产者、Surface 生命周期和线程契约正确,并不是看到 SurfaceView 就必须额外 new Thread。

普通 View 和 SurfaceView 能同时存在吗? ​

可以,例如视频页面用 SurfaceView 显示视频,用普通 View 显示按钮和标题。它们的内容来源和合成方式不同,所以需要考虑层级、裁剪和过渡行为;不能把视频内容完全当作普通 onDraw 中的一张图片来推断。

易混淆点 ​

“SurfaceView 必须自己开线程绘制”不准确;相机或解码器也可以作为内容生产者。

参考资料 ​

内容来源 ​

用完整回答理解机制,用真实证据解释项目。