虛擬導航(NavigationBar)欄適配

虛擬導航(NavigationBar)欄適配

作過屏幕適配的同窗都知道Android的NavigationBar適配是個問題,尤爲是那些NavigationBar還能夠動態隱藏顯示的,那就更蛋疼了。bash

好比下面:工具

NavigationBar的顯示與隱藏,會直接改變屏幕的可用高度。ui

若是咱們的操做是跟動態獲取的屏幕高度相關的,那就悲劇了,若是不作特殊處理,是不會主動響應屏幕高度變化的。this

NavigationBar顯示的實例

咱們來看個實例,先看下顯示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隱藏的實例

再看下隱藏NavigationBar時手機的高度: 代碼不變,具體操做以下:get

輸出log以下:

E: ScreenWidth:1080
E: ScreenHeight:1920
複製代碼

能夠看出NavigationBar隱藏與顯示時獲取到的屏幕高度是不一樣的。NavigationBar隱藏時屏幕高度爲1920px,NavigationBar顯示時屏幕高度爲1792px。

NavigationBar動態顯示和隱藏

下面咱們看個例子,模擬用戶在當前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就是真實的可見高度。

若是咱們遇到相似的需求時,用這種方式進行適配便可。

相關文章
相關標籤/搜索