Android 自定义Camera 屏幕适配
2018-01-03 本文已影响180人
Coder_熊哥哥
最近公司在做录像功能,通过摄像头获取预览画面,因为后期要把一帧画面缩放 翻转,如果预览画面过大,这块处理比较耗时,要取一个600左右合理大小,但后来发现并不行,因为Camera规定摄像头必须设置他所支持的分辨率,不然会FC。
最后想取出一个接近600的分辨率之后发现会预览变形,脸被拉的很长很长,这是因为取出来分辨率和SurfaceView 比例不一致导致的拉伸。
就成了这个鬼样子

解决办法就是通过计算屏幕比例和摄像头接近一个比例,这样预览画面就不会变形了。
获取SurfaceView宽高
我这里是全屏的,所以直接拿了屏幕的宽到
public static int getScreenWidth(Context context){
DisplayMetrics displayMetrics = new DisplayMetrics();
((WindowManager) (context.getSystemService(Context.WINDOW_SERVICE))).getDefaultDisplay().getMetrics(displayMetrics);
return displayMetrics.widthPixels;
}
public static int getScreenHeight(Context context){
DisplayMetrics displayMetrics = new DisplayMetrics();
((WindowManager) (context.getSystemService(Context.WINDOW_SERVICE))).getDefaultDisplay().getMetrics(displayMetrics);
return displayMetrics.heightPixels;
}
计算比例
float scale = (float)imageWidth /(float)imageHeight ;
获取摄像头支持的分辨率
Camera.Parameters camParams = mCamera.getParameters();
List<Camera.Size> sizes = camParams.getSupportedPreviewSizes();
计算比对出最合适的分辨率
//minWidth 最小起的尺寸
public Size getPreviewSize(List<Camera.Size> list,int minWidth,float scale) {
for (int i=0;i<list.size();i++) {
Size size = list.get(i);
if ((size.width > minWidth) && equalRate(size,scale)) {
return size;
}
}
//有可能出现找不到合适的分辨率
return null;
}
public boolean equalRate(Size s, float rate) {
float r = (float) (s.width) / (float) (s.height);
if (Math.abs(r - rate) <= 0.2) {
return true;
} else {
return false;
}
}

画面总算看上去正常多了,但可能出现一个问题,找不到合适的分辨率,目前还没遇到这么奇葩的机器。