如何使用CameraX设置正确的纵横比?

ngl*_*ber 7 android android-jetpack android-camerax

我正在使用CameraX代码实验室,即使使用setTargetAspectRatiosetTargetResolution方法,预览中的纵横比也错误。

private fun startCamera() {
    // Create configuration object for the viewfinder use case
    val previewConfig = PreviewConfig.Builder().apply {
        setTargetAspectRatio(Rational(1, 1))
        setTargetResolution(Size(640, 640))
    }.build()
    ...
Run Code Online (Sandbox Code Playgroud)

布局使用的是硬编码的大小,如代码实验室中所示。

<TextureView
    android:id="@+id/view_finder"
    android:layout_width="640px"
    android:layout_height="640px"
    ...
Run Code Online (Sandbox Code Playgroud)

如果库具有CameraTextureView和属性android:scaleType(类似于的现有属性ImageView),可以将预览调整为预览大小,那就太好了。

CameraX错误的宽高比

小智 14

你尝试了吗?

    val metrics = DisplayMetrics().also { viewFinder.display.getRealMetrics(it) }
    val screenSize = Size(metrics.widthPixels, metrics.heightPixels)
    val screenAspectRatio = Rational(metrics.widthPixels, metrics.heightPixels)

    val viewFinderConfig = PreviewConfig.Builder().apply {
            //...
            setTargetResolution(screenSize)
            setTargetAspectRatio(screenAspectRatio)
            setTargetRotation(viewFinder.display.rotation)
        }.build()

    val preview = AutoFitPreviewBuilder.build(viewFinderConfig, viewFinder)
Run Code Online (Sandbox Code Playgroud)

您可以在此处找到AutoFitPreviewBuilder:https://gist.github.com/yevhenRoman/90681822adef43350844464be95d23f1

我建议您使用dp或constaraints设置TextureView的宽度和高度。让我知道它是否对您有用,谢谢!

  • 抱歉。也没有用:(预览画面仍然拉伸...关于视图大小,我知道dp是推荐的方法,我只是遵循代码实验室。 (3认同)
  • @nglauber 您是否尝试过使用示例代码?如果你按原样克隆并运行它会发生什么:https://github.com/android/camera/tree/master/CameraXBasic (2认同)
  • @OscarWahltinez,示例代码可以正常工作。比较两者之后,我注意到当删除此调用`preview.setOnPreviewOutputUpdateListener`时,预览不再拉伸。谢谢你的提示。但是,整个预览(一个矩形)都位于视图(一个矩形)的内部,类似于ImageView的CENTER_INSIDE缩放比例类型,我想要类似于CENTER_CROP的东西。这带来了我的问题的第二点:有一个CameraTextureView很好,我们可以在其中设置相机预览的比例类型。 (2认同)
  • setTargetAspectRatio 需要 AspectRatio 类型的 *int*,不再是有理数:( (2认同)