当前位置: 首页 > news >正文

SurfaceView、TextureView、SurfaceTexture 和 GLSurfaceView

在 Android 中,SurfaceViewTextureViewSurfaceTextureGLSurfaceView 是与图形渲染和视频播放密切相关的核心类,它们各自有不同的特性和适用场景。下面详细对比它们的区别和用途:


1. SurfaceView

特点

  • 独立的绘图表面SurfaceView 拥有独立的 Surface(由 SurfaceFlinger 直接管理),与主窗口分离,不依赖主线程 UI 渲染
  • 双缓冲机制:减少画面撕裂(Tearing)。
  • 高效渲染:适用于视频播放、相机预览、游戏等高性能场景。
  • 层级限制:由于是独立 Surface,可能会被其他视图遮挡(需通过 setZOrderOnTopsetZOrderMediaOverlay 调整层级)。

生命周期

  • Surface 的创建和销毁通过 SurfaceHolder.Callback 监听:
    surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {@Overridepublic void surfaceCreated(SurfaceHolder holder) { /* Surface 可用 */ }@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { /* Surface 尺寸变化 */ }@Overridepublic void surfaceDestroyed(SurfaceHolder holder) { /* Surface 销毁 */ }
    });
    

适用场景

  • 视频播放(MediaPlayerExoPlayer
  • 相机预览(Camera2 API)
  • 高性能游戏(如 OpenGL ES 渲染)

2. TextureView

特点

  • 基于 SurfaceTexture:在 View 系统内渲染,支持动画、变换(平移、旋转、缩放)和透明度
  • 依赖主线程:通过 HardwareLayer 合成,性能略低于 SurfaceView
  • 无层级问题:作为普通 View,可以和其他视图自由叠加。

生命周期

  • 通过 SurfaceTextureListener 监听:
    textureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {@Overridepublic void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { /* 可用 */ }@Overridepublic void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { /* 尺寸变化 */ }@Overridepublic boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { /* 销毁 */ return true; }@Overridepublic void onSurfaceTextureUpdated(SurfaceTexture surface) { /* 内容更新 */ }
    });
    

适用场景

  • 需要动态变换(如视频播放 + 动画)
  • 与其他视图混合渲染(如叠加 UI 控件)

3. SurfaceTexture

特点

  • 不直接显示:仅提供图像数据流(BufferQueue 的生产者端),需要配合 TextureViewSurfaceView 渲染。
  • 离屏渲染:从 CameraMediaCodec 等获取图像流,处理后输出到 Surface
  • 低延迟:适用于相机滤镜、视频帧处理等场景。

基本用法

// 创建 SurfaceTexture 并监听帧更新
SurfaceTexture surfaceTexture = new SurfaceTexture(textureId);
surfaceTexture.setOnFrameAvailableListener(surface -> { /* 新帧可用时回调 */ });// 将 SurfaceTexture 包装成 Surface,供相机/解码器使用
Surface surface = new Surface(surfaceTexture);
camera.setPreviewSurface(surface);

适用场景

  • 相机实时滤镜(如美颜)
  • 视频帧处理(如 OpenGL ES 后期处理)

4. GLSurfaceView

特点

  • 封装 OpenGL ES 渲染:继承自 SurfaceView,内置 EGL 管理、渲染线程和 GLSurfaceView.Renderer 接口。
  • 简化 OpenGL 开发:自动处理 Surface 生命周期和渲染循环。
  • 高性能图形:适用于 3D 图形、游戏、图像处理。

基本用法

glSurfaceView.setRenderer(new GLSurfaceView.Renderer() {@Overridepublic void onSurfaceCreated(GL10 gl, EGLConfig config) { /* OpenGL 初始化 */ }@Overridepublic void onSurfaceChanged(GL10 gl, int width, int height) { /* 视图尺寸变化 */ }@Overridepublic void onDrawFrame(GL10 gl) { /* 逐帧渲染 */ }
});
glSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY); // 连续渲染

适用场景

  • 3D 游戏(Unity/Unreal 底层)
  • 实时图像处理(如滤镜、特效)

对比总结

特性SurfaceViewTextureViewSurfaceTextureGLSurfaceView
渲染目标独立 Surface基于 View 系统离屏 BufferQueue独立 Surface + OpenGL
性能⭐⭐⭐⭐⭐(最高)⭐⭐⭐(依赖 UI 线程)⭐⭐⭐⭐(低延迟)⭐⭐⭐⭐⭐(GPU 加速)
动画/变换支持❌ 不支持✅ 支持❌ 需手动处理❌ 需 OpenGL 实现
层级问题可能被遮挡不直接显示类似 SurfaceView
适用场景视频/相机/游戏动态 UI + 视频帧处理/滤镜OpenGL ES 图形渲染

如何选择?

  1. 视频播放/相机预览SurfaceView(性能最优)。
  2. 视频 + UI 动画/变换TextureView
  3. 相机滤镜/帧处理SurfaceTexture + OpenGL ES
  4. 3D 图形/游戏GLSurfaceView(或直接使用游戏引擎)。

理解它们的差异,能帮助你在不同场景下选择最合适的组件!

http://www.lryc.cn/news/593533.html

相关文章:

  • eNSP综合实验(DNCP、NAT、TELET、HTTP、DNS)
  • 西门子 S7-1500 PLC 电源选型指南:系统电源与负载电源的核心区别
  • 【Linux服务器】-zabbix通过proxy进行分级监控
  • 【初识数据结构】CS61B中的基本图算法:DFS, BFS, Dijkstra, A* 算法及其来历用法
  • JavaSE-接口
  • 枚举类高级用法
  • 嵌入式学习-PyTorch(8)-day24
  • Ubuntu20.04 samba配置
  • 读书笔记:最好使用C++转型操作符
  • UE5制作小地图
  • CSS篇——第二章 六十五项关键技能(下篇)
  • Django3 - Web前端开发基础 HTML、CSS和JavaScript
  • 【C语言进阶】题目练习(3)
  • 【RK3576】【Android14】摄像头MIPI开发调试
  • Android Auto 即将推出新功能
  • 7月19日日记
  • NJU 凸优化导论(9) 对偶(II)KKT条件+变形重构
  • react+antd+表格拖拽排序以及上移、下移、移到顶部、移到底部
  • Git仓库使用
  • 网络原理——TCP
  • string【下】- 内功修炼(搓底层)
  • 零基础 “入坑” Java--- 十二、抽象类和接口
  • LibreTv在线观影项目部署开箱即用
  • QT窗口(5)-对话框
  • MySQL基础教程
  • 变频器实习Day10
  • 06-人机共生:Prompt之外的思考
  • VRRP-虚拟路由冗余协议
  • Spring AI 项目实战(十九):Spring Boot + AI + Vue3 + OSS + DashScope 构建多模态视觉理解平台(附完整源码)
  • 【HarmonyOS】Ability Kit - Stage模型