欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

android沉浸式状态理解

程序员文章站 2022-04-21 17:49:28
...

在听说沉浸式状态之前,说实在的我连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沉浸式状态理解

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 DecorView深入理解

android apis

colorAccent,colorPrimary,colorPrimaryDark做什么的?

相关标签: 沉浸式