You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在TextureView切换相机时清除最后一帧预览显示空白画面

解决TextureView切换相机时保留最后一帧的问题

这问题我做相机功能时也踩过坑!stopPreview()确实只会停止相机的预览输出,但TextureView本身会缓存最后一帧画面,不会自动清空。要实现切换过程中显示空白,有几个简单有效的方案,按需选择就行:

方法一:直接清空TextureView画布内容

调用stopPreview()后,直接操作TextureView的画布覆盖掉旧帧:

// 停止旧相机预览
camera.stopPreview();

// 清空TextureView画面
SurfaceTexture surfaceTexture = textureView.getSurfaceTexture();
if (surfaceTexture != null) {
    surfaceTexture.setDefaultBufferSize(textureView.getWidth(), textureView.getHeight());
    // 锁定画布绘制空白帧
    Canvas canvas = textureView.lockCanvas();
    if (canvas != null) {
        // 可以换成和页面背景一致的颜色,或者透明色
        canvas.drawColor(Color.BLACK);
        textureView.unlockCanvasAndPost(canvas);
    }
}

// 后续执行切换相机、启动新预览的逻辑

这个方案直接操作TextureView底层,清空效果即时,适合追求简洁的场景。

方法二:临时覆盖空白View

如果不想触碰SurfaceTexture细节,用一个空白View临时遮挡是更直观的办法:

  1. 在布局中给TextureView添加一个同级的空白View(命名比如blankCoverView),默认设置android:visibility="gone",大小位置和TextureView完全一致
  2. 切换相机时按以下流程执行:
// 切换开始,显示空白遮挡
blankCoverView.setVisibility(View.VISIBLE);

// 停止旧相机并释放
camera.stopPreview();
camera.release();

// 初始化并启动新相机预览
camera = Camera.open(targetCameraId);
camera.setPreviewTexture(textureView.getSurfaceTexture());
camera.startPreview();

// 新预览启动后,隐藏遮挡
blankCoverView.setVisibility(View.GONE);

这个方案还能扩展,比如把空白View换成带加载动画的布局,提升用户体验。

额外提示(针对Camera2 API)

如果你的项目用的是Android 5.0+的Camera2 API,在关闭旧的CaptureSession后,可以调用textureView.getSurfaceTexture().release()重置SurfaceTexture,之后再为新相机创建预览Surface,也能实现清空效果。

注意事项

  • 操作TextureView画布时要确保在主线程执行,避免线程安全问题
  • 空白遮挡View要和TextureView的布局参数完全匹配,防止出现错位
  • 相机切换的核心逻辑(释放、重新初始化)建议放在异步线程,避免阻塞主线程导致UI卡顿

内容的提问来源于stack exchange,提问作者sticky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:39:34