使用Selfie Segmentation实现背景移除叠加效果时,如何隐藏预览视图?
嗨,我看你现在用CameraX的Selfie Segmentation结合OverlayEffect做背景移除,但遇到了预览视图和叠加效果同时显示的问题,想只保留叠加后的最终效果对吧?我给你几个实用的调整方案,结合你的现有代码就能快速搞定:
视觉隐藏PreviewView(最直接的方法)
你不能直接把PreviewView设为View.GONE——因为CameraX的帧分析、Selfie Segmentation都依赖Preview的Surface来获取实时画面。但你可以让它在视觉上消失,比如在onCreate方法初始化viewFinder之后,加上这行代码:viewFinder.alpha = 0f // 完全透明,底层仍正常提供帧数据 // 或者用INVISIBLE,效果一样:viewFinder.visibility = View.INVISIBLE这样PreviewView就不会在界面上显示,但CameraX的所有功能(包括Selfie Segmentation分析、OverlayEffect绘制)都能正常运行,你只会看到叠加后的效果。
确保OverlayEffect全屏覆盖绘制
检查你greenScreenEffect的onDrawListener逻辑,要保证绘制的内容是全屏的,这样才能完全替代预览的视觉呈现。比如把绘制代码改成这样:greenScreenEffect.setOnDrawListener { frame -> if (!::mask.isInitialized || !::bitmap.isInitialized) { return@setOnDrawListener true } // 先清空之前的绘制内容 frame.overlayCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR) // 全屏绘制你的叠加图和遮罩 val fullScreenBounds = frame.overlayCanvas.clipBounds frame.overlayCanvas.drawBitmap(bitmap, null, fullScreenBounds, null) frame.overlayCanvas.drawBitmap(mask, null, fullScreenBounds, paint) }布局层级优化(可选)
如果你的布局里有其他容器,也可以把承载Overlay效果的视图放在PreviewView的上层,并且设置为全屏,同时给PreviewView设置背景透明。不过这个方法不如前两个直接,适合需要更复杂布局的场景。
另外提醒你:调整后拍照功能不受影响,因为ImageCapture用例和Preview是独立的,只要CameraX的绑定逻辑正常,拍照就能正常保存处理后的图片。
内容来源于stack exchange

