DisplayMetrics获取宽高不对

adb  Android  2021年9月7日 am8:08发布3年前 (2021)更新 91es.com站长
38 0 0

前言

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获取到的屏幕高度不对

 历史上的今天

  1. 2023: Can't determine type for tag(0条评论)
  2. 2022: 系统应用MediaButton的使用方式(0条评论)
  3. 2019: 贾平凹:制造声音(0条评论)
版权声明 1、 本站名称: 91易搜
2、 本站网址: 91es.com3xcn.com
3、 本站内容: 部分来源于网络,仅供学习和参考,若侵权请留言
3、 本站申明: 个人流水账日记,内容并不保证有效

暂无评论

暂无评论...

随机推荐

[代码]开启WiFi调试

前言开启WiFi调试有两种,一种是adb开启,二是app中代码开启。第一种是可以,但毕竟麻烦,这里我就不细说了,可以百度一下。下面是选择第二种方式。正文以下是开启WiFi debug的代码,这里记录一下,方便查阅。隐藏内容!付费阅读后才能查看!¥2 ¥3多个隐藏块只需支付一次付费阅读参...

[摘抄]Linux之find命令详解

前言find是个使用频率比较高的命令。常常用它在系统特定目录下,查找具有某种特征的文件。记录一下,方便自己查阅。正文命令的格式:find [-path……] -options [-print -exec -ok]path要查找的目录路~ 表示$HOME目录. 表示当前目录/ 表...

[NDK开发]Android JNI 开发之静态注册

前言简单记录一下,方便自己查阅。PS: Android jni开发主要依赖Android开发平台,sdk和ndk三个部分Android SDK : Version 31JAVA Sdk : java1.8NDK : android-ndk-r21d上面只是举个例...

Web网站置灰的几种方式代码

前言众所周知,一般有大事情,很多官方网站的首页就会置灰。对这个比较感兴趣,因此就查询了一下,发现设置全站置灰的方式很简单。记录一下,方便自己查阅。PS: 本文内容摘抄的,文末有原作者连接正文置灰涉及全屏置灰,另外一种是首屏置灰。下面记录一下置灰的代码。全屏置灰方式一亲测,有效。...

Kotlin之子类和子类型

前言简单记录下一下Kotlin中子类和子类型的相关知识,方便自己查阅。小结子类是继承的概念,如果B继承A,则B就是A的子类。如果需要使用类型A的变量时,可以使用类型B的变量来代替,则此时类型B就是A的子类型。在需要使用时,用子类去替代父类,此时子类就是父类的子类型。正文...

刘半农:叫我如何不想她

天上飘着些微云,地上吹着些微风。啊!微风吹动了我头发,教我如何不想她? 月光恋爱着海洋,海洋恋爱着月光。啊!这般蜜也似的银夜,教我如何不想她? 水面落花慢慢流,水底鱼儿慢慢游。啊!燕子你说些什么话?教我如何不想她? 枯树在冷风里摇。...