包含三个尺寸:手机显示屏尺寸,SurfaceView尺寸,Camera.Size尺寸。
其中:SurfaceView尺寸是可以调整的,手机显示屏尺寸和Camera.Size尺寸无法调整,所以只能根据手机显示屏尺寸找到Camera.Size中最接近的尺寸,然后将SurfaceView调整为匹配的尺寸。将在SurfaceView外的界面留空,以达到全屏的效果(没有合适的尺寸,是达不到完全全屏的,小部分留空效果和全屏差不多)。
算法:
// mShowPreview = findViewById(R.id.showPreview);
//int CAMERA_WIDHT = 0,int CAMERA_HEIGHT = 0;private void fit_screem(){FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(mSurfaceView.getLayoutParams());int int_range = 10000;List<Camera.Size> ls = new ArrayList<Camera.Size>();ls =mCamera.getParameters().getSupportedPreviewSizes();
// 将手机屏幕的尺寸附初始值int screem_height = ScreenUtils.width,screem_widht = ScreenUtils.height;
// 先找到宽和显示屏最接近的值for(int i =0;i<ls.size();i++){if(Math.abs(screem_height - ls.get(i).height)<int_range ){int_range = Math.abs(screem_height - ls.get(i).height);CAMERA_HEIGHT = ls.get(i).height;}}
// 再找到和宽匹配,并和高最接近的值作为高int_range = 10000;for(int i =0;i<ls.size();i++){if(ls.get(i).height == CAMERA_HEIGHT && Math.abs(screem_widht- ls.get(i).width)<int_range){int_range = Math.abs(screem_widht - ls.get(i).width);CAMERA_WIDHT = ls.get(i).width;}}lp.height = CAMERA_WIDHT;lp.width = CAMERA_HEIGHT ;mSurfaceView.setLayoutParams(lp);}
以上代码很奇怪,高和宽在做运算比较,原因是Camera.Size中的尺寸是横屏的尺寸,宽大于高,所以最后
lp.height = CAMERA_WIDHT;
lp.width = CAMERA_HEIGHT;
之所以将高和宽名字写反,是因为后面将相机旋转90后,高和宽的值就是正确的。