如何将Jetpack CameraX预览从后切换到前,反之亦然?

时间:2019-07-24 08:26:59

标签: android android-jetpack android-camerax

当我尝试将摄像机预览从后退切换到时,我的屏幕冻结了,如果我最小化屏幕并重新启动,则摄像机预览可以完美地工作。 下面是相机代码。

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)
}

updateTransform 代码为

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()
        }

并在按钮上调用上面的代码后,单击预览以获取免费内容。

1 个答案:

答案 0 :(得分:0)