如何在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临时遮挡是更直观的办法:
- 在布局中给TextureView添加一个同级的空白View(命名比如
blankCoverView),默认设置android:visibility="gone",大小位置和TextureView完全一致 - 切换相机时按以下流程执行:
// 切换开始,显示空白遮挡 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
相关产品推荐
相关产品推荐

