作過屏幕適配的同窗都知道Android的NavigationBar適配是個問題,尤爲是那些NavigationBar還能夠動態隱藏顯示的,那就更蛋疼了。bash
好比下面:工具
NavigationBar的顯示與隱藏,會直接改變屏幕的可用高度。ui
若是咱們的操做是跟動態獲取的屏幕高度
相關的,那就悲劇了,若是不作特殊處理,是不會主動響應屏幕高度變化的。this
咱們來看個實例,先看下顯示NavigationBar時手機的高度:spa
代碼以下: 在Activity#onCreate方法裏面添加以下代碼:code
LogUtils.e(TAG, "ScreenWidth:" + ScreenUtils.getScreenW(this));
LogUtils.e(TAG, "ScreenHeight:" + ScreenUtils.getScreenH(this));
複製代碼
工具類以下:cdn
/**
* 獲取屏幕寬度
*/
public static int getScreenW(Context context) {
DisplayMetrics dm = context.getResources().getDisplayMetrics();
int w = dm.widthPixels;
return w;
}
/**
* 獲取屏幕高度
*/
public static int getScreenH(Context context) {
DisplayMetrics dm = context.getResources().getDisplayMetrics();
int h = dm.heightPixels;
return h;
}
複製代碼
具體操做以下:server
輸出log以下:blog
E: ScreenWidth:1080
E: ScreenHeight:1792
複製代碼
再看下隱藏NavigationBar時手機的高度: 代碼不變,具體操做以下:get
輸出log以下:
E: ScreenWidth:1080
E: ScreenHeight:1920
複製代碼
能夠看出NavigationBar隱藏與顯示時獲取到的屏幕高度是不一樣的。NavigationBar隱藏時屏幕高度爲1920px,NavigationBar顯示時屏幕高度爲1792px。
下面咱們看個例子,模擬用戶在當前Avtivity內部隱藏、顯示導航欄操做。咱們經過給根View註冊ViewTreeObserver.OnGlobalLayoutListener
監聽器來監聽NavigationBar的隱藏於顯示。代碼以下:
globalLayoutListener = () -> {
LogUtils.e(TAG, "ScreenWidth111:" + ScreenUtils.getScreenW(AdaptiveNavigationBarActivity.this));
LogUtils.e(TAG, "ScreenHeight111:" + ScreenUtils.getScreenH(AdaptiveNavigationBarActivity.this));
};
rootView.getViewTreeObserver().addOnGlobalLayoutListener(globalLayoutListener);
複製代碼
咱們進行以下操做:
能夠看到輸出以下:
NavigationBar從顯示到隱藏:
E: ScreenWidth111:1080
E: ScreenHeight111:1920
複製代碼
NavigationBar從隱藏到顯示:
E: ScreenWidth111:1080
E: ScreenHeight111:1920
複製代碼
能夠看出,在NavigationBar的隱藏顯示狀態變動時,咱們經過常規方式獲取到的屏幕高度是不變的。
咱們如何才能獲取到真實的可用屏幕高度呢?
咱們在監聽器中添加以下代碼:
Rect r = new Rect();
//獲取當前界面可視部分,若是NavigationBar可用,就包含其高度。
getWindow().getDecorView().getWindowVisibleDisplayFrame(r);
int realHeight = r.bottom;
LogUtils.e(TAG, "realHeight:" + realHeight);
複製代碼
而後咱們再作NavigationBar隱藏顯示的操做,能夠看到以下log:
NavigationBar從顯示到隱藏:
E: ScreenWidth111:1080
E: ScreenHeight111:1920
E: realHeight:1920
複製代碼
NavigationBar從隱藏到顯示:
E: ScreenWidth111:1080
E: ScreenHeight111:1920
E: realHeight:1792
複製代碼
此時獲取到的高度r.bottom
就是真實的可見高度。
若是咱們遇到相似的需求時,用這種方式進行適配便可。