DisplayMetrics获取宽高不对

adb  Android  2021年9月7日 am8:08发布3年前 (2021)更新 城堡大人
61 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、 本站名称: 笔友城堡
2、 本站网址: https://www.biumall.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

暂无评论

暂无评论...

随机推荐

李娟:想起外婆吐舌头的样子

外婆有个习惯性的小动作,就是吐舌头。通常这一动作会出现在做了错事之后。而她做了错事通常会先掖着瞒着,如打碎了糖罐子,就悄悄把碎片扫一扫,剩糖撮一撮,换个一模一样的罐子装了原样摆着。直到你问她:糖为什么突然少了半罐子?她就吐吐舌头,笑眯眯地坦白。家里的金鱼死后,鱼缸一直空在那里,空了很久。有一天却发...

SpannableStringBuilder的简单使用

前言本文记录一下SpannableStringBuilder的使用,同时也介绍一下SpannableString记录于此,方便自己查阅。PS: 本文摘抄和整理正文SpannableString,SpannableStringBuilder和String从字面看就是他们存在一定的关系。就如...

Android 8.0后音频焦点处理小结

前提两个或两个以上的 Android 应用可同时向同一输出流播放音频,系统会将所有音频流混合在一起。为了避免所有音乐应用同时播放,Android 引入了“音频焦点”的概念。一次只能有一个应用获得音频焦点。音频焦点采用合作模式对,合作模式,你可以准守也可以不准守。Android建议应用遵守...

RadioButton和CheckBox介绍

前言记录一下Android中的RadioButton和CheckBox控件常用xml配置,虽然简单,但偶尔还是可能写错导致一些问题。主要涉及日夜模式换肤时,部分配置可能有问题,所谓为了自己查阅,记录一下。正文RadioButton<RadioGroup   android:id...

Android dab SElinux权限配置

前言Android 13配置第三方DAB(数字音频广播)的SELINUX权限配置简单记录,随便记录,只是方便自己查阅。不同平台不一样。正文本文主要是集成第三方的DAB,DAB用了串口通信,需要适配串口节点权限以及SELINUX权限。如果是系统应用,也就是BSP只要把串口权限搞定即可。...

《人间值得》前言

大家好,我是中村恒子,今年90岁,从事心理(精神科)医生工作将近70年了。因为是医生,所以和大家一样每天朝九晚五地工作。与其说我仍在工作,倒不如说是被要求工作。说实话,我真心感谢信任我的患者朋友,这样我能在工作中有机会与各种各样的人交流。每个人都会有烦恼,在人世间,我们各有各的烦恼。其中,既有职...