对于自定义相机,我们设置他的预览尺寸PreviewSize的时候,是要通过获取系统支持的预览尺寸getSupportedPreViewSize获得的。但是getSupportedPreViewSize集合,遍历每个尺寸的时候,都会发现他的宽度大于高度的,为了防止预览图像拉伸,我们是不是应该预览界面SurfaceView的宽度大于高度。但是又不科学,比如相机旋转90度,刚刚使我们正拿着手机的角度,此时高大于宽,但是系统相机全屏都是好好的,完全没有拉伸的。这到底是个什么情况,求解答!!!求脱坑!!!
具体函数不熟,不妨大胆推测一下。
假定你的目标是全屏方式预览。
getSupportedPreViewSize 给的是横屏尺寸,而现在手持状态是竖屏;那么你要把尺寸高、宽交换,图片旋转90度显示。
默认的本来就是横屏的呀,你开启camera的时候,有个mCamera.setDisplayOrientation,通过这个来设置就行了,你的surfaceView不用变的。
附上自己的camera开启参数。
mCamera = Camera.open(mCamId);
Camera.Parameters params = mCamera.getParameters();
Camera.Size size = mCamera.new Size(mPreviewWidth, mPreviewHeight);
if (!params.getSupportedPreviewSizes().contains(size) || !params.getSupportedPictureSizes().contains(size)) {
Toast.makeText(getContext(), String.format("Unsupported resolution %dx%d", size.width, size.height), Toast.LENGTH_SHORT).show();
stopCamera();
return false;
}
if (params.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) {
params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
}
/***** set parameters *****/
params.setPictureSize(mPreviewWidth, mPreviewHeight);
params.setPreviewSize(mPreviewWidth, mPreviewHeight);
int[] range = findClosestFpsRange(SrsEncoder.VFPS, params.getSupportedPreviewFpsRange());
params.setPreviewFpsRange(range[0], range[1]);
params.setPreviewFormat(ImageFormat.NV21);
params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
params.setWhiteBalance(Camera.Parameters.WHITE_BALANCE_AUTO);
params.setSceneMode(Camera.Parameters.SCENE_MODE_AUTO);
if (!params.getSupportedFocusModes().isEmpty()) {
params.setFocusMode(params.getSupportedFocusModes().get(0));
}
mCamera.setParameters(params);
mCamera.setDisplayOrientation(mPreviewRotation);
try {
mCamera.setPreviewTexture(surfaceTexture);
mCamera.setPreviewCallback(this);
} catch (IOException e) {
e.printStackTrace();
}
mCamera.startPreview();