【问题标题】:How to enable Camera Preview on a Click or Tap in Jetpack Compose如何在 Jetpack Compose 中通过单击或点击启用相机预览
【发布时间】:2023-02-04 00:20:47
【问题描述】:

我是 Jetpack Compose 的新手,想实现以下目标。用户可以单击/点击预览框,并相应地启用或禁用相机预览。

目前我正在使用下面的代码来显示预览。

AndroidView(
                factory = { context ->
                    val previewView = PreviewView(context)
                    val preview = Preview.Builder().build()
                    val selector = CameraSelector.Builder()
                        .requireLensFacing(CameraSelector.LENS_FACING_BACK)
                        .build()
                    preview.setSurfaceProvider(previewView.surfaceProvider)
                    val imageAnalysis = ImageAnalysis.Builder()
                        .setTargetResolution(
                            Size(
                                previewView.width,
                                previewView.height
                            )
                        )
                        .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
                        .build()
                    imageAnalysis.setAnalyzer(
                        ContextCompat.getMainExecutor(context),
                       
                    )
                    try {
                        cameraProviderFuture.get().bindToLifecycle(
                            lifecycleOwner,
                            selector,
                            preview,
                            imageAnalysis
                        )
                    } catch (e: Exception) {
                        e.printStackTrace()
                    }
                    previewView
                },
                modifier = Modifier.weight(1f)
            )

提前致谢。请帮忙。

【问题讨论】:

    标签: android android-jetpack-compose android-camera2


    【解决方案1】:

    在 Jetpack Compose 中,您可以使用 CameraX 库和 CameraPreview 可组合项在单击或点击时启用相机预览。

    下面是一个示例,说明如何实现在您点击按钮时启动的相机预览:

    @Composable
    fun CameraPreview(lifecycleOwner: LifecycleOwner, cameraProviderFuture: ListenableFuture<CameraX.LensFacingCamera>) {
        val preview = rememberPreview()
        val selector = rememberCameraSelector()
        val imageAnalysis = rememberImageAnalysis()
        Box(modifier = Modifier.fillMaxSize()) {
            PreviewView(
                modifier = Modifier.fillMaxSize(),
                surfaceProvider = preview.surfaceProvider
            )
        }
        try {
            cameraProviderFuture.get().bindToLifecycle(
                lifecycleOwner,
                selector,
                preview,
                imageAnalysis
            )
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
    
    @Composable
    fun rememberPreview() = remember {
        Preview.Builder().build()
    }
    
    @Composable
    fun rememberCameraSelector() = remember {
        CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build()
    }
    
    @Composable
    fun rememberImageAnalysis() = remember {
        ImageAnalysis.Builder().setTargetResolution(Size(previewView.width, previewView.height)).setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST).build()
    }
    

    在 CameraPreview 可组合项中,PreviewView 用于显示相机预览,rememberPreview、rememberCameraSelector 和 rememberImageAnalysis 函数用于跨合成保留预览、选择器和图像分析的状态。 cameraProviderFuture.get().bindToLifecycle 方法用于将相机、选择器、预览和图像分析绑定到作为参数提供的 lifecycleOwner 的生命周期。

    【讨论】:

      猜你喜欢
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 2022-11-24
      • 1970-01-01
      • 2021-06-16
      • 2021-06-03
      • 1970-01-01
      相关资源
      最近更新 更多