Android UI系列Camera想关Android开发

Android 自定义Camera 屏幕适配

2018-01-03  本文已影响180人  Coder_熊哥哥

最近公司在做录像功能,通过摄像头获取预览画面,因为后期要把一帧画面缩放 翻转,如果预览画面过大,这块处理比较耗时,要取一个600左右合理大小,但后来发现并不行,因为Camera规定摄像头必须设置他所支持的分辨率,不然会FC。

最后想取出一个接近600的分辨率之后发现会预览变形,脸被拉的很长很长,这是因为取出来分辨率和SurfaceView 比例不一致导致的拉伸。
就成了这个鬼样子


QQ截图20180103152107.png

解决办法就是通过计算屏幕比例和摄像头接近一个比例,这样预览画面就不会变形了。

获取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;
        }
    }

QQ截图20180103152444.png

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

上一篇 下一篇

猜你喜欢

热点阅读