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

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

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

状态栏(StatusBar)

这里写图片描述

.
.
.

虚拟键(NavigationBar)

Android 状态栏(StatusBar)和虚拟键(NavigationBar)的一些设置_第1张图片

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 处于隐藏状态
            }
        }

你可能感兴趣的:(Android 状态栏(StatusBar)和虚拟键(NavigationBar)的一些设置)