外观
SurfaceView 与 TextureView 有什么区别?
标准回答
普通 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 必须自己开线程绘制”不准确;相机或解码器也可以作为内容生产者。
参考资料
内容来源
- Android 技术札记 · 原条目
surface