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

时间:2019-05-22 23:36:41

标签: android jetpack android-camerax

我正在使用CameraX codelab,即使使用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()
    ...

并且布局使用代码实验室中显示的硬编码大小。

<TextureView
    android:id="@+id/view_finder"
    android:layout_width="640px"
    android:layout_height="640px"
    ...

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

CameraX wrong aspect ratio

4 个答案:

答案 0 :(得分:1)

您尝试过吗?

    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)

和AutoFitPreviewBuilder,您可以在这里找到: https://gist.github.com/yevhenRoman/90681822adef43350844464be95d23f1

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

答案 1 :(得分:1)

https://stackoverflow.com/a/49449986/9397052存在类似问题的解决方案。确定分辨率后,请勿使用setTargetAspectRatio函数;相反,您应该只使用setTargetResolution。然后它应该可以正常工作。

答案 2 :(得分:1)

根据官方Android documentation: “ 不允许在同一用例上同时设置目标纵横比和目标分辨率。

尽管如果尝试执行此操作,编译器不会引发错误,但是可能会发生意外结果。

答案 3 :(得分:0)

您可以使用TextureView来设置Matrix的长宽比,如下所示:

Matrix txform = new Matrix();
textureView.getTransform(txform);
txform.setScale((float) = videoWidth / viewWidth, (float) videoHeight / viewHeight);// aspect ratio
textureView.setTransform(txform); // apply matrix