如何锁定/冻结CameraX预览的TextureView?

5
我正在跟随CameraX 代码实验室,并查看他们的示例应用程序和Android Studio中的源代码,但似乎没有办法冻结或锁定显示预览帧的TextureView

在Camera2 API中,我们只需调用类似于cameraCaptureSession?.stopRepeating()的内容,TextureView将停止从相机获取输入。

我冻结预览的用例是,在TextureView上添加其他动画时,向用户显示当前正在保存的图像。

2个回答

19
// You can unbind from any UseCase
CameraX.unbind(previewUseCase)
// In this way TextureView will hold the last frame


 // for version 1.0.0-alpha07
 cameraProvider.unbind(preview);

3
谢谢,这很有效。为了重新启用预览,我只需要再次绑定previewUseCase即可。 - Chee-Yi
@yevhen_69 我使用 CameraX.unbindAll() 删除了所有内容,但它仍然保留着最后一帧。如何将其完全关闭?就像关闭相机一样? - Shubham Agrawal
如果您想要删除最后一帧,为什么不干脆将预览视图整个移除呢?@ShubhamAgrawal - Bitcoin Cash - ADA enthusiast

1
你可以使用 PreviewView.getBitmap() 来捕获出现在预览屏幕上的最新图像。这非常快速,而且你甚至不需要旋转或翻转图像。 我的 XML 代码:
        <androidx.camera.view.PreviewView
            android:id="@+id/viewFinder"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            app:layout_constraintDimensionRatio="3:3"
            app:layout_constraintTop_toTopOf="parent"/>

        <ImageView
            android:visibility="gone"
            android:id="@+id/ivPreview"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            app:layout_constraintDimensionRatio="3:3"
            app:layout_constraintTop_toTopOf="parent"/>

我的先前代码,处理来自OnImageCapturedCallbackOnImageSavedCallback的图像:

private fun showCapturedImage(bitmap: Bitmap, rotationDegrees: Float) {
        viewFinder.visibility = View.GONE
        ivPreview.visibility = View.VISIBLE
        var rotatedBitmap = ImageUtils.rotateImage(bitmap, rotationDegrees).toSquare()
        if (isTakeFacePhoto){
            rotatedBitmap = rotatedBitmap.flipBitmap()
        }
        ivPreview.setImageBitmap(rotatedBitmap)
    }

使用PreviewView.getBitmap()之后,当前代码

val bitmap = viewFinder.getBitmap()

showCapturedImage(bitmap)

private fun showCapturedImage(bitmap: Bitmap) {
           viewFinder.visibility = View.GONE
           ivPreview.visibility = View.VISIBLE
           ivPreview.setImageBitmap(bitmap)
}

如果您计划使用 OnImageSavedCallback 保存图像,请记住从 PreviewView.getBitmap() 到从 OnImageSavedCallback 保存的文件可能会有轻微延迟,因此这两个图像取决于延迟可能会非常不同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接