虚拟导航(NavigationBar)栏适配

简介: 做过屏幕适配的同学都知道Android的NavigationBar适配是个问题,尤其是那些NavigationBar还可以动态隐藏显示的,那就更蛋疼了。

虚拟导航(NavigationBar)栏适配

做过屏幕适配的同学都知道Android的NavigationBar适配是个问题,尤其是那些NavigationBar还可以动态隐藏显示的,那就更蛋疼了。

比如下面:

NavigationBar的显示与隐藏,会直接改变屏幕的可用高度。

如果我们的操作是跟动态获取的屏幕高度相关的,那就悲剧了,如果不做特殊处理,是不会主动响应屏幕高度变化的。

NavigationBar显示的实例

我们来看个实例,先看下显示NavigationBar时手机的高度:

代码如下:
在Activity#onCreate方法里面添加如下代码:

LogUtils.e(TAG, "ScreenWidth:" + ScreenUtils.getScreenW(this));
LogUtils.e(TAG, "ScreenHeight:" + ScreenUtils.getScreenH(this));

工具类如下:

/**
 * 获取屏幕宽度
 */
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;
}

具体操作如下:

输出log如下:

E: ScreenWidth:1080
E: ScreenHeight:1792

NavigationBar隐藏的实例

再看下隐藏NavigationBar时手机的高度:
代码不变,具体操作如下:

输出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就是真实的可见高度。

如果我们遇到类似的需求时,用这种方式进行适配即可。

相关文章
|
10月前
|
Android开发 数据安全/隐私保护 开发者
Android自定义view之模仿登录界面文本输入框(华为云APP)
本文介绍了一款自定义输入框的实现,包含静态效果、hint值浮动动画及功能扩展。通过组合多个控件完成界面布局,使用TranslateAnimation与AlphaAnimation实现hint文字上下浮动效果,支持密码加密解密显示、去除键盘回车空格输入、光标定位等功能。代码基于Android平台,提供完整源码与attrs配置,方便复用与定制。希望对开发者有所帮助。
205 0
|
前端开发 Android开发 iOS开发
react native 实现图片预览 图片保存 react-native-image-zoom-viewer
图片 预览,和保存 功能 应该是很常见的APP 功能 。实现起来也很简单。 这里用到的组件是:https://github.com/ascoders/react-native-image-viewer 看下新效果图: [图片上传中.
6950 0
|
API Android开发 Kotlin
Android实战经验分享之如何获取状态栏和导航栏的高度
在Android开发中,掌握状态栏和导航栏的高度对于优化UI布局至关重要。本文介绍两种主要方法:一是通过资源名称获取,简单且兼容性好;二是利用WindowInsets,适用于新版Android,准确性高。文中提供了Kotlin代码示例,并对比了两者的优缺点及适用场景。
1715 1
|
安全 搜索推荐 SEO
个人网站制作的步骤及流程
本文为个人网站制作流程指南,分为六步:明确需求、选择域名托管、搭建建站工具、完善素材内容、测试优化及发布维护。推荐使用PageAdmin CMS,拥有丰富的模板和编辑器,易上手且功能强大。
2506 1
|
XML 存储 测试技术
Android系统 添加动态控制SystemUI状态栏、导航栏和下拉菜单
Android系统 添加动态控制SystemUI状态栏、导航栏和下拉菜单
3541 2
|
存储 Java Android开发
Android|记一个导致 logback 无法输出日志的问题
在给一个 Android 项目添加 logback 日志框架时,遇到一个导致无法正常输出日志的问题,这里记录一下。
400 2
|
监控 网络协议 Linux
振南技术干货集:各大平台串口调试软件大赏(7)
振南技术干货集:各大平台串口调试软件大赏(7)
|
编解码 Linux Android开发
什么是Widevine?Widevine DRM详解
Widevine是一项用于各种浏览器,包括Google设备和Android设备的技术。即使你是Android设备的用户,也有很多人可能对Widevine一无所知。因此,本文将深入解释Widevine的概念,以便更全面地理解它。我们还将介绍兼容Widevine技术的设备和应用程序,请继续阅读以获取更多信息。
11680 0

热门文章

最新文章