当前位置: 代码迷 >> 综合 >> android SurfaceView + Camera全屏自适应屏幕尺寸
  详细解决方案

android SurfaceView + Camera全屏自适应屏幕尺寸

热度:40   发布时间:2024-01-13 05:28:58.0

包含三个尺寸:手机显示屏尺寸,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后,高和宽的值就是正确的。

  相关解决方案