虚拟导航栏对屏幕分辨率的影响(主要针对华为机)

来源:互联网 发布:纳什均衡与社会学 知乎 编辑:程序博客网 时间:2024/05/22 02:32

最近做一个项目,在初始化相机时需要设置预览分辨率 ,我们采取和手机分辨率相近的比例,例如4:3,或者16:9.的手机,预览分辨率的话选择接近这一比例的一组数据,代码如下:

Camera.Parameters parameters = camera.getParameters();
List<Camera.Size> list = parameters.getSupportedPreviewSizes();
Camera.Size size;
int length = list.size();
int previewWidth = 480;
int previewheight = 640;
int second_previewWidth = 0;
int second_previewheight = 0;
if (length == 1)
{
size = list.get(0);
previewWidth = size.width;
previewheight = size.height;
}
else 
{
for (int i = 0; i < length; i++)
{
size = list.get(i);
// System.out.println("宽   "+size.width+"   高"+size.height);
if ((width<height&&height*3==width*4)||(width>height&&width*3==height*4))
{
if (size.height <= 960 || size.width <= 1280)
{

second_previewWidth = size.width; 
second_previewheight = size.height;


if (previewWidth <= second_previewWidth
&& second_previewWidth * 3 == second_previewheight * 4)
{
previewWidth = second_previewWidth;
previewheight = second_previewheight;
}

}
}
else 
{
if((width<height&&height*9==width*16)||(width>height&&width*9==height*16)){
               if ((size.height <= 960 || size.width <= 1280)&&size.width*9==size.height*16) {
               
                            second_previewWidth = size.width;
                            second_previewheight = size.height;
                            if (previewWidth <=second_previewWidth) {
                                previewWidth = second_previewWidth;
                                previewheight = second_previewheight;
                            }
                        }
              }
else{
              if (size.height <= 960 || size.width <= 1280)
{
             
second_previewWidth = size.width;
second_previewheight = size.height;
if (previewWidth <= second_previewWidth)
{
previewWidth = second_previewWidth;
previewheight = second_previewheight;
}
}
              }

}
}
}
preWidth = previewWidth;
preHeight = previewheight;
System.out.println("预览分辨率:" + preWidth + "    " + preHeight);
parameters.setPictureFormat(PixelFormat.JPEG);
parameters.setPreviewSize(preWidth, preHeight);

但是在华为手机上,由于虚拟导航栏的原因,会使得手机宽高出现偏差,如1920*1080的机器在竖屏时获取的宽小于1080,这样的话相机中的图片会出现轻微的变形,曾经想过利用沉浸模式去掉虚拟导航栏,结果导航栏不见了但是尺寸依旧不对,这里提供一个忽略虚拟导航栏,获取手机真实尺寸的方法:

 @SuppressLint("NewApi") private void setScreenSize(Context context)
    {
            int x, y;
            WindowManager wm = ((WindowManager)
                    context.getSystemService(Context.WINDOW_SERVICE));
            Display display = wm.getDefaultDisplay();
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2)
            {
                    Point screenSize = new Point();
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
                    {
                            display.getRealSize(screenSize);
                            x = screenSize.x;
                            y = screenSize.y;
                    } else
                    {
                            display.getSize(screenSize);
                            x = screenSize.x;
                            y = screenSize.y;
                    }
            } else
            {
                    x = display.getWidth();
                    y = display.getHeight();
            }


            width = x;
            height = y;
    }

经测试,此方法可行

0 0
原创粉丝点击