我正在为Android应用程序制作自定义相机,如"SnapChat",但相机预览在诸如(Moto g第二代,一个)但很少(三星s3,三星s4)等少数设备上延伸 . 我使用了以下参考Camera display / preview in full screen does not maintain aspect ratio - image is skewed, stretched in order to fit on the screen . 但这对我100%没有帮助 . 我在分享屏幕 .
Stretched image on Samsung Moto G second generation is .
Samsung S3 images which does not stretched is Above
private void setPreviewLayout() {
if (null == mCamera) {
return;
}
Camera.Parameters parameters = null;
Camera.Size size = null;
try {
int screenWidth = (int) getResources().getDisplayMetrics().widthPixels;
int screenHeight = (int) getResources().getDisplayMetrics().heightPixels;
parameters = mCamera.getParameters();
size = getOptimalPreviewSize(mCamera.getParameters().getSupportedPreviewSizes(), screenWidth, screenHeight);
if (size != null) {
parameters.setPreviewSize(size.width, size.height);
}
parameters.setPictureSize(screenHeight, screenWidth);
;
mCamera.setParameters(parameters);
if (on && currentCameraId == Camera.CameraInfo.CAMERA_FACING_BACK) {
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_ON);
} else {
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
}
parameters.setWhiteBalance(Camera.Parameters.WHITE_BALANCE_AUTO);
parameters.setExposureCompensation(0);
parameters.setPictureFormat(ImageFormat.JPEG);
parameters.setJpegQuality(100);
List<String> focusModes = parameters.getSupportedFocusModes();
if (focusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) {
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
} else if (focusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
}
mCamera.setParameters(parameters);
/*
* camera.setPreviewDisplay(surfaceHolder); camera.startPreview();
*/
} catch (Exception e) {
e.printStackTrace();
}
}
private Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int w, int h) {
final double ASPECT_TOLERANCE = 0.1;
double targetRatio = (double) h / w;
if (sizes == null)
return null;
Camera.Size optimalSize = null;
double minDiff = Double.MAX_VALUE;
int targetHeight = h;
for (Camera.Size size : sizes) {
double ratio = (double) size.width / size.height;
if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE)
continue;
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
if (optimalSize == null) {
minDiff = Double.MAX_VALUE;
for (Camera.Size size : sizes) {
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
}
return optimalSize;
}
3 回答
使用
getOptimalPreviewSize()
很重要,但它并不能解决所有布局中所有设备的所有拉伸问题 . 您必须准备好稍微裁剪预览,以便预览填充屏幕而不会失真 .有不同的技术来强制表面的大小不同于实际的屏幕尺寸,但这个我觉得最容易:
我将
CameraView
添加到我的布局中:为了强调主要思想,我没有包含错误处理,而且我这里没有显示相机如何is actually started with a secondary Looper .
您需要覆盖SurfaceView类的onMeasure方法以获取surfaceview的宽度和高度
然后将您获得的预览大小设置为相机参数预览大小 .
getSuggestedMinimumHeight(),getSuggestedMinimumWidth()是View类的方法
希望这可以帮助 !!!
试试这个它正在工作......