Как исправить поддержку поворота 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.
Буду очень признателен за любые предложения по починке. Хорошего дня!
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
}
Из документации
override fun 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
Добавьте этот код
весело 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
У меня была эта проблема с CameraX Alpha 06. Затем я решил ее с помощью ответа Марчина Мругаса. Но при переходе на Alpha09 я избавился от этого кода, и ротация прошла нормально. Похоже, CameraX теперь сама обрабатывает поворот.
Попробуйте этот метод преобразования из официального примера проекта Android Camera X: https://github.com/android/camera/blob/master/CameraXBasic/app/src/main/java/com/android/example/cameraxbasic/utils/AutoFitPreviewBuilder.kt#L132
Надеюсь, это поможет.