Android Surface“家族”的辨别

190 阅读3分钟

1. 核心成员

Surface

  • 概念

    • 一个基本的绘制目标,用于与硬件显示器或缓冲区交换数据。
  • 功能

    • 提供一个图像缓冲区,供生产者(Producer,如 Canvas 或 OpenGL)渲染图像内容。
    • 通常与 SurfaceHolderSurfaceView 一起使用。
  • 使用场景

    • 直接绘制到屏幕上。
    • 提供给视频解码器或摄像头等硬件模块输出图像。

SurfaceHolder

  • 概念

    • Surface 的间接管理接口,用于管理和监听 Surface 的生命周期。
  • 功能

    • 提供访问 Surface 的入口。
    • 允许监听 Surface 的创建、变更和销毁。
  • 使用场景

    • 通常和 SurfaceView 配合使用,作为获取 Surface 的桥梁。
  • 代码示例

SurfaceView surfaceView = findViewById(R.id.surfaceView);
SurfaceHolder holder = surfaceView.getHolder();
holder.addCallback(new SurfaceHolder.Callback() {
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        Canvas canvas = holder.lockCanvas();
        canvas.drawColor(Color.RED);
        holder.unlockCanvasAndPost(canvas);
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {}
});

2. 与 Texture(纹理)相关的成员

SurfaceTexture

  • 概念

    • 一种特殊的 Surface,可以被绑定为 OpenGL 的纹理(Texture)。
  • 功能

    • 将数据流(例如摄像头、视频解码器)直接作为 OpenGL 纹理进行渲染。
    • 提供一个可操作的纹理目标,通过 updateTexImage() 更新内容。
  • 使用场景

    • TextureView 的内部实现。
    • 作为 OpenGL 的输入纹理(GL_TEXTURE_2D)。
  • 代码示例

    SurfaceTexture surfaceTexture = new SurfaceTexture(textureId);
    Surface surface = new Surface(surfaceTexture);
    mediaPlayer.setSurface(surface);
    

TextureView

  • 概念

    • 一个高级 UI 组件,基于 SurfaceTexture 实现,继承自View,绘制在UI线程中,Draw的逻辑大致与View一致。
  • 功能

    • 用于显示基于 SurfaceTexture 的内容,并支持与其他 UI 叠加。
  • 使用场景

    • 视频播放。
    • 图像或特效渲染。
  • 特点

    • 支持变换(旋转、缩放、裁剪)。
    • 适合需要与其他视图混合的场景。

3. 高级管理成员

SurfaceView

  • 概念

    • 一个拥有独立 Surface 的 View,允许子线程直接渲染内容。
  • 功能

    • 提供一个独立的绘制区域,与主 UI 分离。
    • 不与其他视图叠加(覆盖在最顶层)。
  • 使用场景

    • 高性能动画或视频播放。
    • 需要直接控制渲染的场景(如游戏开发)。
  • 特点

    • 渲染效率高,适合高帧率场景。
    • 使用复杂,需手动管理生命周期。

SurfaceControl

  • 概念

    • Android 中的高层次渲染控制类,用于直接操作系统的图形堆栈(Layer 和 Surface 的创建与管理)。
  • 功能

    • 提供更底层的 API 用于管理 Surface
    • 支持多个 Surface 的合成与变换操作。
  • 使用场景

    • 系统级 UI(如状态栏、导航栏)。
    • 多窗口管理。
  • 特点

    • 面向系统开发者,不直接用于普通应用开发。

4. 图像传递相关成员

ImageReader

  • 概念

    • 提供一个 Surface,用于接收来自摄像头、视频解码器或其他数据源的图像帧。
  • 功能

    • 允许获取 Surface 并接收图像帧数据。
    • 提供回调机制监听新帧。
  • 使用场景

    • 摄像头图像捕获。
    • 视频帧处理。
  • 代码示例

    复制代码
    ImageReader imageReader = ImageReader.newInstance(width, height, ImageFormat.YUV_420_888, 2);
    Surface surface = imageReader.getSurface();
    

SurfaceFlinger

  • 概念

    • Android 系统的图形合成器,用于将所有 Surface 的内容合成为一帧图像并显示到屏幕上。
  • 功能

    • 接收多个 Surface 的缓冲区内容。
    • 合成最终的显示画面。
  • 使用场景

    • 系统内部使用,应用开发者无需直接接触。
  • 特点

    • 是整个 Android 图形显示的核心组件。

总结辨别

成员名称描述使用场景
Surface基础绘制目标,用于生产者/消费者模式视频、游戏绘制、Canvas
SurfaceHolderSurface 的管理接口配合 SurfaceView 使用
SurfaceView拥有独立 Surface 的 View高性能渲染、游戏场景
SurfaceTextureOpenGL 的纹理目标图像流纹理渲染
TextureView基于 SurfaceTexture 的 UI 组件,继承View,主线程绘制视频播放、UI 混合
ImageReader图像帧接收器摄像头、视频帧捕获
SurfaceControl低级别 Surface 管理接口系统 UI 渲染控制
SurfaceFlinger系统合成器,用于所有 Surface 的最终合成系统内部使用

通过这种分类和辨别,你可以根据具体的开发场景选择最合适的成员来实现需求。