1

我有一个 CameraPreview,它选择与视图上的可用空间最接近的可用图像尺寸,并选择正确的相机预览尺寸以匹配它。您可能会想象 CameraPreview 看起来有点像这样:

private void createCameraPreviewSession() {
try {
   mSurfaceView.getHolder().setFixedSize(width, height);
   Surface surface = mSurfaceView.getHolder().getSurface();
   mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
   mPreviewRequestBuilder.addTarget(surface);
    if (mCameraDevice != null && mImageReader != null && fragmentState == CONNECTING_CAMERA) {
      mCameraDevice.createCaptureSession(Arrays.asList(surface), createStateCallback(), null);
    } 
  } catch (CameraAccessException e) {
     Log.w(TAG, "Access exception during CaptureSession initialisation: " + e.getMessage());
     Log.getStackTraceString(e);
  }

}

在当前的测试设备上,宽度和高度为 1280x720 或 720x1280,具体取决于方向。奇怪的是,当我第一次打开使用此预览的活动时,相机视图被扭曲了。当我旋转它时,它保持扭曲,当我将它旋转回来时,它看起来很好,并且在第一次旋转后,比例通常(但并非总是)保持正常。

经过一番摸索,我终于找到了这个dumpsys SurfaceFlinger命令,它可以让我看到我的表面的细节,这给了我一些新的信息。当视图不好时,它看起来像这样:


图层名称

Z | 比较类型 | 显示帧 (LTRB) | 源作物 (LTRB)


SurfaceView - com.myApp/com.myApp.CameraActivity#0

4294967294 | 设备 | 0 0 720 1229 | 39.0 0.0 960.0 720.0


com.myApp/com.myApp.CameraActivity#0

21055 | 设备 | 0 20 720 1280 | 0.0 20.0 720.0 1280.0


但是当它很好时,它看起来像这样:


图层名称

Z | 比较类型 | 显示帧 (LTRB) | 源作物 (LTRB)


SurfaceView - com.myApp/com.myApp.CameraActivity#0

4294967294 | 设备 | 0 0 720 1184 | 0.0 0.0 1280.0 720.0


com.myApp/com.myApp.CameraActivity#0

21055 | 设备 | 0 20 720 1280 | 0.0 20.0 720.0 1280.0


显然,两种情况下 Source Crop 的设置完全不同——但谁能告诉我为什么?源作物来自哪里,我该如何改变它?如果我无法更改它,有没有办法找到我的表面的 Source Crop 设置?如果我知道我应该能够找到一种方法来弥补差距。

4

0 回答 0