如何在Jetpack Compose中使用CameraView?

Icefex

当前在Compose中没有与CameraView(和PreviewView)等效的功能。是否可以将其包装并以组合布局显示?

哈比卜·卡泽米

目前,Camerax没有任何官方的Comosable函数,因此我们必须在compose中膨胀旧版android视图。

为了实现我们可以使用AndroidView可组合函数,它接受两个参数

  • @paramresId要膨胀的布局资源的ID。
  • @parampostInflationCallback扩大布局后要调用的回调。

并访问生命周期和上下文,我们使用环境

val lifecycleOwner = LifecycleOwnerAmbient.current
val context = ContextAmbient.current

有了所需的一切后,我们开始做吧:

创建布局 camera_host.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.camera.view.PreviewView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/previewView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

并使用AndroidViewComposable函数对其进行充气

@Composable
fun SimpleCameraPreview() {
    val lifecycleOwner = LifecycleOwnerAmbient.current
    val context = ContextAmbient.current
    val cameraProviderFuture = remember { ProcessCameraProvider.getInstance(context) }
    AndroidView(resId = R.layout.camera_host) { inflatedLayout ->
       //You can call
      // findViewById<>() and etc ... on inflatedLayout
      // here PreviewView is the root of my layout so I just cast it to
      // the PreviewView and no findViewById is required

        cameraProviderFuture.addListener(Runnable {
            val cameraProvider = cameraProviderFuture.get()
            bindPreview(
                 lifecycleOwner,
                 inflatedLayout as PreviewView /*the inflated layout*/,
                 cameraProvider)
        }, ContextCompat.getMainExecutor(context))

    }
}

fun bindPreview(
    lifecycleOwner: LifecycleOwner,
    previewView: PreviewView,
    cameraProvider: ProcessCameraProvider
) {
    var preview: Preview = Preview.Builder().build()

    var cameraSelector: CameraSelector = CameraSelector.Builder()
        .requireLensFacing(CameraSelector.LENS_FACING_BACK)
        .build()

    preview.setSurfaceProvider(previewView.createSurfaceProvider())

    var camera = cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, preview)
}
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            SimpleCameraPreview()
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在 Jetpack compose 中使用 Viewmodel

如何在 Jetpack Compose 中使用 SharedFlow

如何在 Jetpack Compose 中使用寻呼机布局?

如何在jetpack compose中使用Android PdfViewer

如何在 Jetpack Compose 的 MutableState 中使用条件

如何在 jetpack compose 中使用复选框控件?

如何在jetpack中使用LayoutAlign撰写

如何在 Jetpack Compose 中使底片覆盖整个屏幕

如何在Jetpack Compose中获取onTouchEvent?

如何在Jetpack Compose中处理导航?

如何在jetpack Compose中将按钮居中?

如何在jetpack compose上回收webview?

如何在 Jetpack Compose 中使用图像占位符进行预览

如何在jetpack compose中使用底部导航栏在屏幕底部放置标签

如何在jetpack compose中使用设置的完整跨度或GridCells的动态数量来实现LazyVerticalGrid?

如何在桌面版jetpack compose中使用.svg文件?

如何在jetpack compose中使用静态值创建可扩展的列表视图

如何在 Jetpack Compose Canvas 中使用 drawRoundRect 仅圆底部 2 个角

如何在jetpack compose的新線圈版本中使用`ImageRequest.Builder.target`?

如何在 Jetpack Compose 中使用 Coil 加載遠程 SVG 圖像

如何在 Jetpack Compose Navigation 中正确使用 Viewmodel

如何在 Jetpack Compose 中使用 Coil 顯示自定義可組合佔位符?

如何在 Jetpack Compose 的 TextField 中正确设置高度?

如何在 Jetpack Compose 中创建表格?

如何在 Jetpack Compose 中获取此 UI?

如何在 Jetpack Compose Desktop 中存储数据?

如何在 Jetpack Compose 中显示横幅广告?

如何在 Jetpack Compose 中围绕画布移动矩形?

如何在 Jetpack Compose 中覆盖系统 onbackpress()