美文网首页
android 另一种获取状态栏高度的方式

android 另一种获取状态栏高度的方式

作者: 碧桃鹦鹉 | 来源:发表于2020-05-13 15:55 被阅读0次

项目中需要做一个接近全屏尺寸的dialog,但是要比状态栏和工具栏低。
所以弹窗的宽度为屏幕宽度,高度为屏幕高度-状态栏高度-工具栏高度。当按着逻辑写完时,发现运行在小米8A手机上显示不正确,比需要的高度更低,但是在三星S7上没问题。因为我获取屏幕高度的方式是:

DisplayMetrics localDisplayMetrics = new DisplayMetrics();
windowManager.getDefaultDisplay()
.getMetrics(localDisplayMetrics);

使用localDisplayMetrics 的heightPixels字段作为屏幕高度。经调试发现,该手机实际分辨率为1520*720,获取到的 localDisplayMetrics的heightPixels为1369:


截屏2020-05-1315.02.15.png

同时又看到 logicalHeight 是1520,也就是正确的屏幕高度。所以就打算改为windowManager.getDefaultDisplay()
.getRealSize()方法获取到logicalHeight。同时看到有这样的两个字段:
largestNominalAppWidth和largestNominalAppHeight。意为“名义上的最大宽度”和“名义上的最大高度”。这两个值应该是包括了横屏和竖屏的情况考虑后的值。
在小米8A上 这些字段的值为
appWidth = 720
appHeight = 1369
largestNominalAppWidth = 1369
largestNominalAppHeight = 1465
logicalHeight = 1520
logicalWidth = 720

在三星S7edge上的值为
appWidth = 1440
appHeight = 2560
largestNominalAppWidth = 2464
largestNominalAppHeight = 2560
logicalHeight = 2560
logicalWidth = 1440

所以经对比两种情况,状态栏高度值statusBarHeight计算公式可为:
statusBarHeight = logicalHeight-logicalHeight== largestNominalAppHeight? largestNominalAppWidth: largestNominalAppHeight;

    @Override
    protected int getDialogHeight()
    {
        Window window = getWindow();
        if (window != null)
        {
            Display display = window.getWindowManager()
                                    .getDefaultDisplay();
            Point largestPoint = new Point();
            Point realPoint = new Point();
            display.getCurrentSizeRange(new Point(), largestPoint);
            display.getRealSize(realPoint);

            int height = realPoint.y == largestPoint.x ? largestPoint.y : largestPoint.x;
            //此处旨在获取准确的多适配的去除状态栏的屏幕高度
            //断点查看windowManager.getDefaultDisplay()
            //这套流程依赖于"认为largestNominalAppWidth和largestNominalAppHeight字段相减的值为状态栏的高度"。
            //可全面适配1.实体按键2.全面屏手势3.虚拟按键,可能仅适用于竖屏,横屏未经验证
            //所以此处不需要主动计算获取状态栏高度
            return height - ToolbarLayout.getToolbarHeight(getContext());
        }

        return super.getDialogHeight();
    }

相关文章

网友评论

      本文标题:android 另一种获取状态栏高度的方式

      本文链接:https://www.haomeiwen.com/subject/efnnnhtx.html