Как исправить поддержку вращения CameraX

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

Портрет: см. изображение

Пейзаж: см. картинку

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

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.

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


person Nikita Lapin    schedule 05.06.2019    source источник
comment
я вижу ошибку в вашем коде   -  person    schedule 05.06.2019
comment
@ Роджер, но не я ...   -  person Nikita Lapin    schedule 05.06.2019
comment
@ Роджер Не могли бы вы ответить на мой вопрос? В чем проблема? ...   -  person Nikita Lapin    schedule 05.06.2019
comment
проверьте stackoverflow.com/a/35431231/6092898   -  person    schedule 05.06.2019
comment
Не могли бы вы попробовать это и обновить меня?   -  person    schedule 05.06.2019
comment
@ Роджер, спасибо за помощь. Я не использую камеру из аппаратного пакета, как ответ, который вы мне предлагаете. Я использую CameraX из Android Jetpack, поэтому, к сожалению, я не могу манипулировать камерой, как там ...   -  person Nikita Lapin    schedule 05.06.2019


Ответы (5)


Решение на основе 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
}
person Marcin Mrugas    schedule 18.07.2019
comment
Он работает с одной стороны, но если я поворачиваю устройство на другую сторону, отображается обратное изображение. Вы знаете об этом? - person Nidhi Desai; 05.12.2019
comment
этот параметр мы не получим в viewCamera.addOnLayoutChangeListener (new View.OnLayoutChangeListener () {@Override public void onLayoutChange (View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom ) {// updateTransform ();}}); - person Nidhi Desai; 05.12.2019

Добавьте этот код

весело onCreate

viewFinder.addOnLayoutChangeListener { _, _, _, _, _, _, _, _, _ -> updateTransform(1920,1080) }

веселый старт

preview.setOnPreviewOutputUpdateListener {

        val parent = viewFinder.parent as ViewGroup
        parent.removeView(viewFinder)
        parent.addView(viewFinder, 0)

        viewFinder.surfaceTexture = it.surfaceTexture
        updateTransform(1920,1080)
    }

весело updateTransform (ширина: Int, высота: Int)

        val metrics = DisplayMetrics().also { viewFinder.display.getRealMetrics(it) }
    val previewWidth = metrics.widthPixels
    val previewHeight = metrics.heightPixels

    matrix.postScale(previewWidth.toFloat() / height,previewHeight.toFloat() /width,centerX,centerY)

Разрешение моего устройства - 1920x1080.

Полный код находится в моем репозитории CameraX

person Ange1D    schedule 19.11.2019

У меня была эта проблема с CameraX Alpha 06. Затем я решил ее с помощью ответа Марчина Мругаса. Но при переходе на Alpha09 я избавился от этого кода, и ротация прошла нормально. Похоже, CameraX теперь сама обрабатывает поворот.

person Jérôme Pietri    schedule 24.01.2020

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

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

person Mike A    schedule 26.06.2019

Из документации

переопределить удовольствие onCreate () {val imageCapture = ImageCapture.Builder (). build ()

val orientationEventListener = object : OrientationEventListener(this as Context) {
    override fun onOrientationChanged(orientation : Int) {
        // Monitors orientation values to determine the target rotation value
        val rotation : Int = when (orientation) {
            in 45..134 -> Surface.ROTATION_270
            in 135..224 -> Surface.ROTATION_180
            in 225..314 -> Surface.ROTATION_90
            else -> Surface.ROTATION_0
        }

        imageCapture.targetRotation = rotation
    }
}
orientationEventListener.enable()
}

Вот ссылка https://developer.android.com/training/camerax/configuration

person Shaon    schedule 15.12.2020