抬头仰望星空,是否能发现自己的渺小。

伪斜杠青年

人们总是混淆了欲望和理想

Android 屏幕高度获取的盲点

有时候不是路不好走

只不过是没看清怎么走

最近做一些动画和位移的时候,遇到了一些奇怪的问题,主要是在屏幕高度上一直不知所措。

代码如下:

val Context.screenSize: Point
get() {
val wm = getSystemService(Context.WINDOW_SERVICE) as WindowManager
val displaySize = Point()
wm.defaultDisplay.getSize(displaySize)
return displaySize
}

高就是context.screenSize.y

但是在不同的手机上得到了不同的结果,某些计算正确,某些错误,偏差有一定规律,在折腾了半天debug后,发现了这个盲点:主要是在于不同的rom厂商对于虚拟三大金刚与状态栏的处理方式不一样。

如果想获取真正的绝对的屏幕高度,使用:

val Context.screenSize: Point
get() {
val wm = getSystemService(Context.WINDOW_SERVICE) as WindowManager
val displaySize = Point()
wm.defaultDisplay.getRealSize(displaySize)
return displaySize
}

区别就在于getSize与getRealSize

getRealSize是返回的真实屏幕宽高,getSize是去除了一些系统固定元素的高度(如状态栏),有些厂商的状态栏只是隐藏了,并没移除,有些则直接移除而非隐藏导致了这个结果。

而网上以前的大多数的文章使用的都是getSize,不能说他们用错了,但是需求不同不要直接复制粘贴。

以上。


本站由以下主机服务商提供服务支持:

2条评论

  • qweenhool

    所以因为厂商的不统一导致用getSize不太准确,用getRealSize获取屏幕真实宽高,然后根据自己需要处理才是最优解吧?

    • Mosaic-C

      是的~ 以前没有刘海的时候就不必在意,现在则挖孔屏,刘海屏百花齐放,就必须要用 getRealSize 进行处理了。

发表评论