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

时间:2019-05-21 12:45:44

标签: android android-camerax

我正在关注CameraX code lab,并在Android Studio中查看了它们的sample app和源代码,但是似乎没有冻结或锁定{{1}的方法}显示预览框架。

在Camera2 API中,我们只能调用TextureView之类的内容,而cameraCaptureSession?.stopRepeating()将停止从摄像机获取输入。

我冻结预览的用例是向用户显示当前保存的图像,因为我在TextureView顶部添加了其他动画。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您可以使用 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 保存的文件可能会有轻微的延迟,因此这两个图像可能真的不同取决于延迟。