【问题标题】:How to fix CameraX rotation support如何修复 CameraX 旋转支持
【发布时间】:2019-06-05 14:38:15
【问题描述】:

我遇到了 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 官方指南中获取此代码。

将非常感谢任何修复建议。祝你有美好的一天!

【问题讨论】:

  • 我在你的代码中发现了一个错误
  • @Roger,但不是我...
  • @Roger 你能回答我的问题吗?哪里出了问题?...
  • 你能试试这个并更新我吗?

标签: android matrix android-jetpack android-camerax


【解决方案1】:

基于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
}

【讨论】:

  • 它适用于单面,但如果我将设备旋转到另一边,它会显示反向图像,你知道吗?
  • 这个参数我们不会在 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(); } });
【解决方案2】:

添加此代码

有趣的创建

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(width:Int,height: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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:
      【解决方案5】:

      来自文档

      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-06-28
        • 2020-09-29
        • 2021-01-03
        • 2020-04-23
        • 2010-11-22
        • 2013-01-13
        • 2017-05-18
        • 2020-11-29
        • 1970-01-01
        相关资源
        最近更新 更多