Как исправить поддержку поворота CameraX - PullRequest
2 голосов
/ 05 июня 2019

Я столкнулся с проблемой поддержки поворота экрана CameraX.

Портрет : see picture

Пейзаж: see picure

Код преобразования:

private void updateTransform() {
    Log.d(TAG, "updateTransform: ");
    Matrix matrix = new Matrix();

    float centerX = cameraViewTextureV.getWidth() / 2f;
    float centerY = cameraViewTextureV.getHeight() / 2f;

    switch (cameraViewTextureV.getDisplay().getRotation()) {
        case Surface.ROTATION_0:
            rotation = 0;
            break;

        case Surface.ROTATION_90:
            rotation = 90;
            break;

        case Surface.ROTATION_180:
            rotation = 180;
            break;

        case Surface.ROTATION_270:
            rotation = 270;
            break;

        default:
            break;
    }

    matrix.postRotate((float) -rotation, centerX, centerY);

    cameraViewTextureV.setTransform(matrix);
}

Итак, как вы можете видеть на фотографиях, поворот экрана с поддержкой камеры не корректен ... Я вызываю метод updateTransform при повороте экрана... Взял этот код из официального руководства для cameraX с сайта разработчиков Android.

Буду очень признателен за любые предложения по исправлению.Хорошего дня!

Ответы [ 2 ]

0 голосов
/ 18 июля 2019

Решение на основе AutoFitPreviewBuilder :

preview.onPreviewOutputUpdateListener = Preview.OnPreviewOutputUpdateListener { output ->
    // Get all dimensions
    val metrics = DisplayMetrics().also { camera_texture_view.display.getRealMetrics(it) }
    val previewWidth = metrics.widthPixels
    val previewHeight = metrics.heightPixels
    val width = output.textureSize.width
    val height = output.textureSize.height
    val centerX = camera_texture_view.width.toFloat() / 2
    val centerY = camera_texture_view.height.toFloat() / 2

    // Get rotation
    val rotation = when (camera_texture_view.display.rotation) {
        Surface.ROTATION_0 -> 0
        Surface.ROTATION_90 -> 90
        Surface.ROTATION_180 -> 180
        Surface.ROTATION_270 -> 270
        else -> throw IllegalStateException()
    }
    val matrix = Matrix()
    // Rotate matrix
    matrix.postRotate(-rotation.toFloat(), centerX, centerY)
    // Scale matrix
    matrix.postScale(
        previewWidth.toFloat() / height,
        previewHeight.toFloat() / width,
        centerX,
        centerY
    )
    // Assign transformation to view
    camera_texture_view.setTransform(matrix)
    camera_texture_view.surfaceTexture = output.surfaceTexture
}
0 голосов
/ 26 июня 2019

Попробуйте этот метод преобразования из официального примера проекта Android Camera X: https://github.com/android/camera/blob/master/CameraXBasic/app/src/main/java/com/android/example/cameraxbasic/utils/AutoFitPreviewBuilder.kt#L132

Надеюсь, это поможет.

...