我有一个 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 设置?如果我知道我应该能够找到一种方法来弥补差距。