1.判断NavigationBar是否显示
首先看几组数据
vivo-X21A: screenRealSize : 2280 , screenHeight : 2201, statusBar : 84, navigationBar : 126(Android9导航栏一键)
vivo-X21A: screenRealSize : 2280 , screenHeight : 2075, statusBar : 84, navigationBar : 126 (Android9导航栏三键)
vivo-X21A: screenRealSize : 2280 , screenHeight : 2201, statusBar : 84, navigationBar : 126 (Android9手势)
meizu: screenRealSize : 1280 , screenHeight : 1280, statusBar : 44, navigationBar : 96 (Android6,物理导航栏)
huaWei-PTC10: screenRealSize : 2310 , screenHeight : 2208, statusBar : 102, navigationBar : 0 (隐藏nvg, Android10)
huawei-PTC10: screenRealSize : 2310 , screenHeight : 2090, statusBar : 102, navigationBar : 118 (显示nvg, Android10)
huawei-xx1: screenRealSize : 1920 , screenHeight : 1808, statusBar : 72, navigationBar : 112 (显示nvg, Android9)
huawei-xx1: screenRealSize : 1920 , screenHeight : 1920, statusBar : 72, navigationBar : 112 (隐藏nvg, Android9)
huawei-xx2: screenRealSize : 1560 , screenHeight : 1422, statusBar : 54, navigationBar : 84 (显示nvg, Android9)
huawei-xx2: screenRealSize : 1560 , screenHeight : 1506, statusBar : 54, navigationBar : 0 (隐藏nvg, Android9)
将就着看吧,可以发现,华为最近出的手机的screenHeight不包含statusBar和navigationBar的高度,导航栏不显示的时候,获取到的navigationBar高度也不一样。
而我手上的vivo手机就更奇葩了,居然出现screenHeight + statusBar > screenRealSize的情况 !!显然vivo这款手机的screenheight也是不包含statusBar的高度的。
而老机型的魅族,screenHeight = screenRealHeight, 这还是很好理解的。
总之,想要直接获取navigationBar的高度来判断是否显示了导航栏是不行的。因为市场上的定制系统是在是乱的不醒。
最后的办法:
val isNavigationBarShow: Boolean
get() {
val windowManager =
appContext?.getSystemService(Context.WINDOW_SERVICE) as? WindowManager
val display = windowManager?.defaultDisplay
val size = Point()
val realSize = Point()
display?.getSize(size)
display?.getRealSize(realSize)
// 如果显示了NavigationBar, statusBarHeight < navigationBarHeight
return realSize.y > size.y + statusBarHeight
}
2.判断屏幕显示的高度,可见高度+statusBar的高度
val screenHeight: Int
get() {
val windowManager =
appContext?.getSystemService(Context.WINDOW_SERVICE) as? WindowManager
val display = windowManager?.defaultDisplay
val realSize = Point()
display?.getRealSize(realSize)
return if (isNavigationBarShow) {
realSize.y - navigationBarHeight
} else {
realSize.y
}
}