我有一个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
很明显,两种情况下的源作物设置都完全不同-但是有人可以告诉我为什么吗?源作物来自哪里,我该如何更改?如果我无法更改它,是否有办法找到针对我的表面设置的“源裁剪”?如果我知道我应该能够找到一种方法来弥补这种差距。