当我在我的索尼Xperia或我的测试三星S7(仿真器似乎很好)上进入相机视图时,它正确地显示了预览。当我旋转它时,预览会正确旋转,当我旋转回来时,预览会失去它的比例,视图也会扭曲。在第一次旋转之后,每次旋转回来,我都会有同样的扭曲。
目前有效的方法是我使用SurfaceView的scaling:
FrameLayout.LayoutParams newScale = new FrameLayout.LayoutParams(width, height, Gravity.CENTER );
mTextureView.setLayoutParams(newScale);
mTextureView.setScaleX( xScale);
mTextureView.setScaleY( yScale);
mCaptureSession = cameraCaptureSession;
try {
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
mPreviewRequestBuilder.set(CaptureRequest.SCALER_CROP_REGION, cropRectangle);
mPreviewRequest = mPreviewRequestBuilder.build();
mCaptureSession.setRepeatingRequest(mPreviewRequest, getCaptureCallback(), mBackgroundHandler);
} catch (CameraAccessException e) {
// and so on.
}
========================
View Dimensions (720, 1184)
Sensor Dimensions: (3984, 5512)
Final size: 720, 1280
========================
View ratio: 1.7777778 previewRatio: 1.6444445 scale: 1.0
Image preview size is (720, 1184) scale is: (1.0) image size is (720, 1280)
Image scale is (1.3835341, 0.925) Max Image is (3984, 5512) cropRectangle is (441, 0 -> 3543, 5512)
然后我旋转它:
========================
View Dimensions (1184, 720)
Sensor Dimensions: (5512, 3984)
Final size: 1280, 720
========================
View ratio: 0.5625 previewRatio: 0.6081081 scale: 1.0
Image preview size is (1184, 720) scale is: (1.0) view size is (1280, 720)
Image scale is (0.925, 1.3835342) Max Image is (5512, 3984) cropRectangle is (0, 441 -> 5512, 3543)
========================
View Dimensions (720, 1184)
Sensor Dimensions: (3984, 5512)
Final size: 720, 1280
========================
View ratio: 1.7777778 previewRatio: 1.6444445 scale: 1.0
Image preview size is (720, 1184) scale is: (1.0) view size is (720, 1280)
Image scale is (1.3835341, 0.925) Max Image is (3984, 5512) cropRectangle is (441, 0 -> 3543, 5512)
这些比例尺和裁剪矩形看起来和我完全一样,但由于某种原因,最后一幅图像被扭曲得更宽,就好像x比例尺接近1.8或类似。我可以在任何一个方向旋转回横向,它看起来很好,然后再转回纵向,一切又胖了。
更新:如果我使用setXScale并在第二次运行时将其设置为1.0,而不是第一次运行时的值,那么它看起来是正确的。但是当我比较SurfaceView的变换矩阵时,当图像比例不好时,它们是相同的,所以这看起来像是对预览中不好的缩放的补偿。我可以改变缩放的行为方式,使初始预览太窄,旋转后的比例正确,但这仍然没有真正的帮助,因为我需要能够在纵向和横向之间切换,而图像不会被它扭曲,这似乎应该是默认行为。在景观中打开视图的方式与此基本相同-先打开视图时扭曲,然后再打开。
每次都会正确地重新创建CaptureSession。
第二次更新:调用
dumpsys SurfaceFlinger
-------------------------------------------------------------------------------
Layer name
Z | Comp Type | Disp Frame (LTRB) | Source Crop (LTRB)
-------------------------------------------------------------------------------
SurfaceView - com.myapp.CameraActivity#0 4294967294 | Device | 0 0 720 1184 | 0.0 0.0 960.0 720.0
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -