Как установить правильное соотношение сторон с помощью CameraX?

Я слежу за кодовой меткой 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), чтобы настроить предварительный просмотр до размера предварительного просмотра.

https://stackru.com/images/3074aa66e38ebaeb0b7b95981a84846867c0bb66.png?s300

2 ответа

Решение

Ты пробовал это?

    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

Я бы порекомендовал вам установить ширину и высоту для вашего TextureView, используя dp или constaraints. Дайте мне знать, если это работает для вас, спасибо!

Согласно официальной документации Android: "Нельзя устанавливать одновременно целевое соотношение сторон и целевое разрешение в одном варианте использования".

Хотя компилятор не выдает ошибку, если вы попытаетесь это сделать, могут возникнуть непредвиденные результаты.

/questions/40040479/predvaritelnyij-prosmotr-rastyagivaetsya-v-camera2-apis/40040480#40040480 есть решение аналогичной проблемы. После того, как вы выбрали разрешение, не используйтеsetTargetAspectRatioфункция; вместо этого вы должны использовать толькоsetTargetResolution. Тогда он должен работать так же.

Вы можете установить соотношение сторон TextureView с Matrix как это:

Matrix txform = new Matrix();
textureView.getTransform(txform);
txform.setScale((float) = videoWidth / viewWidth, (float) videoHeight / viewHeight);// aspect ratio
textureView.setTransform(txform); // apply matrix
Другие вопросы по тегам