如何将喷气背包相机预览从后切换到前,反之亦然



当我尝试将相机预览从 BACK 切换到 FRONT 时,我的屏幕会冻结,如果我最小化屏幕并重新启动相同的屏幕,那么相机预览就可以完美地工作。下面是相机代码。

private fun startCamera() {
    CameraX.unbindAll()
    val metrics = DisplayMetrics().also { viewFinder.display.getRealMetrics(it) }
    val screenSize = Size(metrics.widthPixels, metrics.heightPixels)
    val screenAspectRatio = Rational(metrics.widthPixels, metrics.heightPixels)
    val previewConfig = PreviewConfig.Builder().apply {
        setLensFacing(lensFacing)
        setTargetResolution(screenSize)
        setTargetAspectRatio(screenAspectRatio)
        setTargetRotation(windowManager.defaultDisplay.rotation)
        setTargetRotation(viewFinder.display.rotation)
    }.build()
    preview = Preview(previewConfig)
    preview.setOnPreviewOutputUpdateListener {
        viewFinder.surfaceTexture = it.surfaceTexture
        updateTransform()
    }

    // Create configuration object for the image capture use case
    val imageCaptureConfig = ImageCaptureConfig.Builder()
        .apply {
            setLensFacing(lensFacing)
            setTargetAspectRatio(screenAspectRatio)
            setTargetRotation(viewFinder.display.rotation)
            setCaptureMode(ImageCapture.CaptureMode.MIN_LATENCY)
        }.build()
    // Build the image capture use case and attach button click listener
    imageCapture = ImageCapture(imageCaptureConfig)
    //for recording the video
    val videoCaptureConfig = VideoCaptureConfig.Builder().apply {
        setLensFacing(lensFacing)
        setTargetAspectRatio(screenAspectRatio)
        setTargetRotation(viewFinder.display.rotation)
    }.build()
    videoCapture = VideoCapture(videoCaptureConfig)
    CameraX.bindToLifecycle(this, preview, imageCapture, videoCapture)
}

并且更新转换代码是

private fun updateTransform() {
    val matrix = Matrix()
    // Compute the center of the view finder
    val centerX = viewFinder.width / 2f
    val centerY = viewFinder.height / 2f
    // Correct preview output to account for display rotation
    val rotationDegrees = when (viewFinder.display.rotation) {
        Surface.ROTATION_0 -> 0
        Surface.ROTATION_90 -> 90
        Surface.ROTATION_180 -> 180
        Surface.ROTATION_270 -> 270
        else -> return
    }
    matrix.postRotate(-rotationDegrees.toFloat(), centerX, centerY)
    // Finally, apply transformations to our TextureView
    viewFinder.setTransform(matrix)
}

我尝试在相机预览之间切换是:

 lensFacing = if (lensFacing == CameraX.LensFacing.BACK) {
            CameraX.LensFacing.FRONT
        } else
            CameraX.LensFacing.BACK
        try {
            CameraX.getCameraWithLensFacing(lensFacing)
            CameraX.unbind(preview, imageCapture, videoCapture)
            startCamera()
        } catch (e: Exception) {
            e.printStackTrace()
        }

在按钮上调用上述代码后,单击预览冻结。

您可能需要在更新的回调中再次添加纹理视图。参考这个,https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-master-dev/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java#168

让我知道它是否有效。

相关内容

  • 没有找到相关文章

最新更新