Android 状态栏(StatusBar)和虚拟键(NavigationBar)的一些设置

最近写项目想写跟IOS一样的沉浸式模式,在写项目中用到的知识在这里记录一下(这个必须要在4.0以上的系统才能有效)

首先弄明白的是什么是StatusBar ,什么是NavigationBar 。用一张图来说明一下

状态栏(StatusBar)

这里写图片描述

.
.
.

虚拟键(NavigationBar)

这里写图片描述

StatusBar和NavigationBar的统称为SystemBar

StatusBar与NavigationBar的控制方法如下
View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE//状态栏(StatusBar)和虚拟键(NavigationBar)都显示
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);//页面到最顶部,状态栏不会隐藏,页面处于状态栏(StatusBar)的下面

上面的setSystemUiVisibility这个方法是控制SystemBar状态的显示 隐藏 。其中setSystemUiVisibility中的参数(常用参数)的作用如下:

INVISIBLE  状态栏(StatusBar)隐藏

SYSTEM_UI_FLAG_VISIBLE :状态栏(StatusBar)和虚拟键(NavigationBar)都显示,不全屏

SYSTEM_UI_FLAG_HIDE_NAVIGATION  //隐藏虚拟按钮(NavigationBar),当页面滑动时候会重新出现

SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION //让页面在虚拟按钮(NavigationBar)的下面,虚拟按钮会挡住页面

SYSTEM_UI_FLAG_FULLSCREEN  //状态栏(StatusBar)会被隐藏,页面到屏幕最顶部

SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN //页面到最顶部,状态栏不会隐藏,页面处于状态栏(StatusBar)的下面

SYSTEM_UI_FLAG_LOW_PROFILE  //状态栏(StatusBar)和虚拟键
(NavigationBar)显示处于低能显示状态(low profile模式),状态栏上一些图标显示会被隐藏。

注:设置多个标志位时要用 | 连接起来,不能多次调用 setSystemUiVisibility。不同的组合SystemBar会有不同的效果

当能控制SystemBar的状态后,接下来设置SystemBar的背景颜色(setStatusBarColor这个方法只有在5.0以上的版本在会有。在5.0以上的版本的状态栏StatusBar有颜色的,所以用setStatusBarColor设置状态栏的颜色)

 if (android.os.Build.VERSION.SDK_INT >= 21) {
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            //getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);//让NavigationBar也为透明颜色
            getWindow().setStatusBarColor(Color.TRANSPARENT);//状态栏(StatusBar)背景设置颜色
        } else if (android.os.Build.VERSION.SDK_INT >= 14) {
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//透明状态栏(StatusBar)
            //getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);//让NavigationBar也为透明颜色
        }else {
            //在4.0以下就没有setSystemUiVisibility这个方法(隐藏状态栏(StatusBar))
        }

上面我把//getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION)这个方法给屏蔽了,是因为在设置这个flags后NavigationBar处于透明状态,但是会覆盖在页面上,会挡住页面。目前还没有找到方法处理这个问题

还有要提到的是SystemBar的监听方法

View decorView = getWindow().getDecorView();
decorView .setOnSystemUiVisibilityChangeListener(new OnSystemUiVisibilityChangeListener() {
        @Override
        public void onSystemUiVisibilityChange(int visibility) {
            if (visibility == 0) {
            // SystemBar 处于显示状态
            } else {
            // SystemBar 处于隐藏状态
            }
        }
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值