Android中DisplayMetrics类获取屏幕尺寸

“缘起”

平时上班忙,没太多时间给自己充电,趁着过端午节敲敲代码练练手,在我想要把PopupWindow高度设置成屏幕高度的1/3时,发现获取到的屏幕高度有问题。

打印日志如下:
2019-06-07 18:37:03.230 27737-27737/customizedView.demmo.com E/znk: onClick: getWindowHeight == 2040
2019-06-07 18:37:03.231 27737-27737/customizedView.demmo.com E/znk: onClick: getWindowWidth == 1080
2019-06-07 18:37:03.232 27737-27737/customizedView.demmo.com E/znk: onClick: getRelHeight == 2160
而我用adb命令获取到的屏幕高度是2160(此处的单位是像素,且是绝对像素,即设备物理像素)

通过自定义的getWindowHeightOrWidth方法获取的屏幕高度是2040,方法定义如下:

    public static int getWindowHeightOrWidth(Activity activity, int flag) {
        DisplayMetrics dm = activity.getResources().getDisplayMetrics();
        //取得窗口属性
        activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
        //窗口高度
        int screenHeight = dm.heightPixels;
        //窗口的宽度
        int screenWidth = dm.widthPixels;
        //可以通过DisplayMetrics类来获取当前窗口的一些信息,DisplayMetrics对象中,取得的宽高维度是以像素为单位(Pixel),“像素”所指的是“绝对像素”而非“相对像素”,
        //绝对像素就是设备的物理像素.PS:手机分辨率就是设备像素
        Log.e(Constants.TAG, dm.toString());
        return flag == 0 ? screenHeight : screenWidth;
    }

为什么获取的高度会小于手机实际高度?原因是这个方法获取的是手机屏幕显示高度,不包含虚拟导航栏,源码的注释是这么写的:大概意思是说如果我们通过Actiivty的引用调用getWindowManager()或者getSystemService(Context.WINDOW_SERVICE)获取WindowManager,那么获取到的尺寸可能小于实际物理尺寸。

解决方案

而真实的高度要通过如下方法获取:

    /**
     * 获取屏幕完整高度(屏幕展示高度+导航栏)[针对具有导航栏的手机]
     */
    public static int getRelHeight(Activity activity) {

        DisplayMetrics dm = new DisplayMetrics();
        int realScreenH = 0;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {//好像是4.2之后才有的虚拟导航栏,目前市面上绝大多数手机都有导航栏
            activity.getWindowManager().getDefaultDisplay().getRealMetrics(dm);
            realScreenH = dm.heightPixels;
            return realScreenH;
        }
        return getWindowHeightOrWidth(activity,Constants.WINDOW_HEIGHT);
    }

有写的不对的地方,欢迎大佬们指正!此博客项目源码地址:https://github.com/ZNKForSky/CustomizedView 欢迎各位童鞋star~

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值