5

我遇到了 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屏幕旋转时我调用方法......从Android开发者网站的cameraX官方指南中获取此代码。

将非常感谢任何修复建议。祝你今天过得愉快!

4

5 回答 5

3

基于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
}
于 2019-07-18T15:53:53.523 回答
1

添加此代码

有趣的创建

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 中

于 2019-11-19T04:31:33.547 回答
1

我在使用 CameraX Alpha 06 时遇到了这个问题。然后我用 Marcin Mrugas 的回答解决了这个问题。但是当迁移到 Alpha09 时,我摆脱了这段代码,旋转就可以了。所以看起来 CameraX 现在自己处理旋转。

于 2020-01-24T08:48:28.807 回答
0

从官方 Android Camera X 示例项目中尝试这种转换方法: https ://github.com/android/camera-samples/blob/153d2d203118dacbd2afeb53b2e8be489677ed98/CameraXBasic/app/src/main/java/com/android/example/cameraxbasic/utils /AutoFitPreviewBuilder.kt#L151

我希望这有帮助。

于 2019-06-26T14:43:38.640 回答
0

从文档

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

于 2020-12-15T19:50:10.023 回答