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
}
}