前言

Android P项目开发时,获取的屏幕高度存在误差,之前项目中获取的高度都是固定的,后面为了适配各种项目,改为了动态获取屏幕高宽。

记录于此,方便自己查阅。

好记性不如烂笔头

正文

Android 版本 : Android P

获取的屏幕高度错误
adb shell wm size

#打印的内容

Physical size: 1024x600

而代码中获取的

DisplayMetrics{density=1.0, width=1024, height=504, scaledDensity=1.0, xdpi=134.07, ydpi=133.684}

你会发现,少了96px。

分析问题

原因是底部导航的高度占用了96px

位置: /frameworks/base/core/res/res/values/config.xml

<!-- Height of the bottom navigation bar in portrait; often the same as @dimen/navigation_bar_height -->
<dimen name="navigation_bar_height_landscape">48dp</dimen>
<dimen name="navigation_bar_height_car_mode">96dp</dimen>
<dimen name="navigation_bar_height_landscape_car_ode">96dp</dimen>

至于具体分析,可以看引用的文章《[DisplayMetrics获取宽高不对]》,该文章的作者有对着分析。

PS: 存在导航栏在左边的,获取的宽度也存在不一致

解决问题
    //配置一个默认的高宽
    private static int screen_width = 1024;
    private static int screen_height = 600;

    public static void initSizeInfo(Activity activity) {
        if (null == activity) {
            Log.d(VideoApp.TAG, "initSizeInfo null;: ");
            return;
        }
        DisplayMetrics dm = new DisplayMetrics();
        //高版本的有底部导航,因此要获取真实的高宽,需要调用的方法不同。
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            activity.getWindowManager().getDefaultDisplay().getRealMetrics(dm);
        } else {
            activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
        }
        Log.d(VideoApp.TAG, "initSizeInfo  : " + dm.toString());
        screen_width = dm.widthPixels;
        screen_height = dm.heightPixels;
        return;
    }

    public static int getScreenWidth() {
        return screen_width;
    }

    public static int getScreenHeight() {
        return screen_height;
    }

参考文章

  1. Android中DisplayMetrics类获取屏幕尺寸
  2. DisplayMetrics获取宽高不对
  3. getResources().getDisplayMetrics().heightPixels获取到的屏幕高度不对

相关文章

暂无评论

none
暂无评论...