android沉浸式状态理解
在听说沉浸式状态之前,说实在的我连status bar、action bar以及navigation bar这几个bar都没有怎么搞清楚。那么什么叫沉浸式状态呢,所谓沉浸式就是给人一种沉浸其中的感觉,表现在android上就是全屏啦,于是我们就先用全屏来简单粗暴的理解沉浸式吧。但是只是全屏肯定不够啊,全屏了我还得交互啊(这里的交互表现在操作界面按钮等上面),但是普通的全屏不能满足这个需求(这个后面会说),于是就需要沉浸式了,这个就是我对沉浸式状态的总体理解,欢迎各位大神拍砖。
1、说说statusbar、actionbar以及navigationbar
关于这几个bar用下面一张图可以简单的说明
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,但这时便无法与界面空间进行交互了,所以加入了沉浸式标签,使得在全屏的时候用户还能与界面控件进行交互。
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、参考文献
上一篇: android 沉浸式
下一篇: 沉浸式的写法