虚拟导航(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就是真实的可见高度。

若是咱们遇到相似的需求时,用这种方式进行适配便可。

相关文章
相关标签/搜索