Android获取屏幕高度的坑

本周发现了一个坑:使用getResources().getDisplayMetrics().heightPixels获取屏幕高度的方法在某些全面屏手机以及带虚拟键手机上的高度不对,比目标高度小了十几个像素,因此做了个小调研。

安卓手机想要获取屏幕高度,有以下几个方法:

//1.这个网上比较少说到,一般会使用一个过时的方法getHeight
Point point = new Point();
getWindowManager().getDefaultDisplay().getSize(point);
point.y
//2.
DisplayMetrics outMetrics = new DisplayMetrics();
manager.getDefaultDisplay().getMetrics(outMetrics);
int height = outMetrics.heightPixels;
//3.上一种的小变式,区别在getRealMetrics
getWindowManager().getDefaultDisplay().getRealMetrics(dm);
 float height = dm.heightPixels;
//4.看起来比较简单的一种
float a = getResources().getDisplayMetrics().heightPixels;

第一个我们先不讲,因为实测和后面2、4基本一样,况且网上说的少用的也少

一开始我用的是方法4(因为他看起来最简单),发现在一些全面屏手机上高度会少了十几个像素,在普通手机上是准确的。
后来发现主要是虚拟按键的问题,getDisplayMetrics().heightPixels会将虚拟按键的高度忽略掉。点击去看到他的说明是The absolute height of the available display size in pixels.问题就在这个available上了。

同理,还有getMetrics方法,在Android4.4之后会隐藏掉状态栏的高度,注释里还写了一大堆,像来自Activity的请求在多窗口模式下会小于物理高度(这又是另一个坑了)

所以getRealMetrics是比较稳妥的一个方法,能够返回完整的屏幕参数。

之前还想到一种方法,在某些时机下主动隐藏虚拟键,这样不也能解决问题吗?
但是这样会有两个比较实际的问题:

  1. 某些手机的虚拟键是无法隐藏的,或者难以隐藏,比如我的魅族16p里有好几种切换模式,如果要做到完美,可能得花精力在部分机型的攻克上。
  2. 更加实际的,隐藏状态栏是肉眼不可见而已,上述方法返回值是不受影响的。

方便记忆

在参考文章1中,作者根据源码位置得到以下结论:

Context.getResources().getDisplayMetrics()依赖于手机系统,获取到的是系统的屏幕信息;
WindowManager.getDefaultDisplay().getMetrics(dm)是获取到Activity的实际屏幕信息。

个人觉得这个说法有点不够严谨,但是确实方便记忆,所以贴出来。

获取真实屏幕高度方法

    public static int getScreenHeight(Context context) {
        DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
        ((Activity)context).getWindowManager().getDefaultDisplay().getRealMetrics(displayMetrics);
        return  displayMetrics.heightPixels;
    }

参考文章:

  1. getResources().getDisplayMetrics()与WindowManager.getDefaultDisplay().getMetrics(dm)获取屏幕信息的区别_Miehalu的博客-CSDN博客
  2. getResources().getDisplayMetrics().heightPixels获取到的屏幕高度不对_束千凡的博客-CSDN博客
  3. https://xiaoyaozjl.iteye.com/blog/2178415

14人点赞

Android分享



作者:虚假雨
链接:https://www.jianshu.com/p/74a7a40437cb
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值