包含三个尺寸:手机显示屏尺寸,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后,高和宽的值就是正确的。
本文介绍了一种算法,用于使摄像头预览画面尽可能地填充整个手机屏幕,同时保持最佳分辨率。通过查找与手机屏幕尺寸最接近的摄像头支持尺寸,并调整SurfaceView大小来实现这一目标。
2102

被折叠的 条评论
为什么被折叠?



