8

我正在关注 CameraX 代码实验室setTargetAspectRatio,即使使用和setTargetResolution方法,我在预览中也得到了错误的纵横比。

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 纵横比错误

4

4 回答 4

21

你试过了吗?

    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 或约束为 TextureView 设置宽度和高度。让我知道它是否适合您,谢谢!

于 2019-05-23T09:31:57.737 回答
2

https://stackoverflow.com/a/49449986/9397052有类似问题的解决方案。在你决定一个决议后,不要使用setTargetAspectRatio函数;相反,您应该只使用setTargetResolution. 然后它应该工作相同。

于 2020-03-26T11:46:43.050 回答
2

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

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

于 2020-05-06T17:43:11.540 回答
0

TextureView您可以像这样设置 a的纵横比Matrix

Matrix txform = new Matrix();
textureView.getTransform(txform);
txform.setScale((float) = videoWidth / viewWidth, (float) videoHeight / viewHeight);// aspect ratio
textureView.setTransform(txform); // apply matrix
于 2019-05-22T23:52:27.853 回答