在听说沉浸式状态之前,说实在的我连status bar、action bar以及navigation bar这几个bar都没有怎么搞清楚。那么什么叫沉浸式状态呢,所谓沉浸式就是给人一种沉浸其中的感觉,表现在android上就是全屏啦,于是我们就先用全屏来简单粗暴的理解沉浸式吧。但是只是全屏肯定不够啊,全屏了我还得交互啊(这里的交互表现在操作界面按钮等上面),但是普通的全屏不能满足这个需求(这个后面会说),于是就需要沉浸式了,这个就是我对沉浸式状态的总体理解,欢迎各位大神拍砖。

1、说说statusbar、actionbar以及navigationbar

关于这几个bar用下面一张图可以简单的说明

android全沉浸模式 沉浸模式和正常模式_全屏


status bar,也就是顶部的一条显示时间、电量、通知等信息的 bar

action bar,程序内顶部的可以添加诸如 search、menu 的 bar

navigation Bar,底部包含 back 键、home 键以及 recent 键的 bar

2、沉浸式和粘性沉浸式

前面说过,沉浸式是带有能够交互的全屏,这里来看看沉浸式的实现

2.1、沉浸式的实现

实现沉浸式主要是通过设置

decorView.setSystemUiVisibility(
        View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION //hide nav bar
                | View.SYSTEM_UI_FLAG_FULLSCREEN   //hide status bar
                | View.SYSTEM_UI_FLAG_IMMERSIVE
);

注意这里的View.SYSTEM_UI_FLAG_IMMERSIVE这个flag指的就是当前页面为沉浸式页面,当设置为View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY时,表示的就是粘性沉浸式页面。这个得decorView通过下面代码实例化

decorView = getWindow().getDecorView();

关于DecorVIew的理解可以去看android DecorView深入理解这篇文章。

我们注意到这里通过View.SYSTEM_UI_FLAG_HIDE_NAVIGATION这个flag来隐藏navigation bar,通过View.SYSTEM_UI_FLAG_FULLSCREEN这个flag来隐藏status bar和action bar, 单全屏时需要同时使用这两个flag,但这时便无法与界面空间进行交互了,所以加入了沉浸式标签,使得在全屏的时候用户还能与界面控件进行交互。

android全沉浸模式 沉浸模式和正常模式_android全沉浸模式_02

2.2、退出沉浸式

退出沉浸式的状态很简单,从手机底部从下往上滑动便可退出沉浸式,但是退出沉浸式状态后,又想回去怎么办,这里有一个办法,通过监听onSystemUiVisibilityChange这个方法来实现,当从沉浸式状态退出时会触发这个方法。

decorView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
    @Override
    public void onSystemUiVisibilityChange(int visibility) {
        //system bars are visible,none of LOW_PROFILE, HIDE_NAVIGATION, or FULLSCREEN flags are set
        if((visibility  & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0){
            //make any desired adjustment to your UI, such as showing the action bar
            Log.e("systemui","system bars are visible");
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    hideSystemUI(null);
                }
            },5000);

        }else{
            Log.e("sytemui","system bars are invisible");
            //adjust UI, such as hiding the actionbar
        }
    }
});

public void hideSystemUI(View view) {
    decorView.setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION //hide nav bar
                    | View.SYSTEM_UI_FLAG_FULLSCREEN   //hide status bar
                    | View.SYSTEM_UI_FLAG_IMMERSIVE
    );
}

这里的代码标识,从沉浸式状态退出5秒后,自动再回到沉浸式状态。

2.3、沉浸式和粘性沉浸式区别

沉浸式和粘性沉浸式都支持全屏交互,但是总得有点什么区别吧,不然聪明的google工程师们也不会用两个flag来加以区别了,我测试了一下,在此进行不完全总结。

区别主要有两点

a、粘性沉浸式退出全屏时,只显示出来了status bar和navigation bar 而action bar没有显示

b、粘性沉浸式退出全屏时,navigation bar半透明,且几秒后会重新进入沉浸式(效果类似2.2小节的沉浸式+onSystemUiVisibilityChange,但是要注意粘性沉浸式也会触发onSystemUiVisibilityChange这个方法)

到目前为止,我发现的区别就是这样,这里也可以看出粘性沉浸式的名字由来是指,用户进入页面后无法完全退出沉浸式状态,所以这样的沉浸式状态具有“粘性”。

3、参考文献

管理系统UI之四:使用全屏沉浸模式

管理系统UI之五:响应UI可见性的变化


android apis