何为沉浸模式,沉浸式顶栏,变色龙状态栏?

沉浸模式是Android 4.4的特性 [图片] 当启用该模式,应用程序的界面将占据整个屏幕,系统自动将隐藏系统的状态栏和导航 栏,让应用程序内容可以…
关注者
237
被浏览
39,471

6 个回答

沉浸模式对应的是 Immersive Mode, 呈现的形式是全屏状态, 隐藏状态栏与导航栏.

关于沉浸式的更多描述参见: Immersive (Android Design).

所谓的沉浸式顶栏, 更多是国内对 Translucent Bar 的误传:

为什么在国内会有很多用户把 「透明栏」(Translucent Bars)称作 「沉浸式顶栏」?

Translucent Bar, 中文译名: 透明栏. 一般呈现的是状态栏和/或导航栏透明或半透明. 最极端的例子是在 Muzei 这样的应用上:

关于透明栏的更多描述参见: System Bars (Material Design).

变色龙状态栏那, 是国内一些用户对变色状态栏的称呼. 来源于某个 Xposed 插件.

沉浸和变色,一个很古老的话题了,因为近期在学习Android,外加我个人对UI体验的偏执,把这部分代码也都学习并测试过,纠正了以往错误的观点,也希望能纠正至今为止依旧很多人错误的观点。。

首先,我用中文列出几个概念;“沉浸”(Immersive),“透明”(Translucent),“变色”,“状态栏”(StatusBar),“导航栏”(NavigationBar)。。另外最后还会提到“全屏”之类的。。

简单来说,“沉浸”和“透明”都是Android4.4加入的新特性,也就是判断VERSION.SDK必须大于或等于API 19,调用才会生效,这一点4.4和5.0包括6.0在使用方法及具体实现代码上都没有区别(但显示效果略有区别,原因其一是Android4.4存在上下阴影的影响)。。

设置“透明”主要有两个方法,在xml主题文件里面设置和在源代码里面调用setFlags()方法(这个方法一直都有,只不过“透明”这个flag是4.4才加入进去的),效果一样,代码也很简单,包括“状态栏”和“导航栏”都可以选择透明化。

设置“沉浸”则可以在源代码里面调用setSystemUiVisibility()方法(这个方法也是一直都有,只不过4.4加入了两个新的flag用来获得“沉浸”效果),代码量比设置“透明”略多,但也不过十几行而已。

而“变色”在Android上是从来就不存在的一个概念!!只是大家根据app显示效果自己YY出来的一个词。在API 19(Android4.4)里面,Google仅仅提供了“透明”这个方法,但是很多开发者发现,在开发过程中如果使用的是带有深色ActionBar的主题,这时对“状态栏”的透明会带来极其丑陋不协调的显示效果,像这个样子(图片来源网络,黑色的那一栏就是ActionBar):

于是大家借鉴iOS7的灵感,可否将“状态栏”颜色设置和ActionBar一样呢?很遗憾,API 19没有提供单独设置“状态栏”颜色的方法(这句话很重要)。。那么问题又来了,我们平时使用的那些在Android4.4上依旧能“变色”的app是怎样实现的呢?那就得感谢程序猿的小聪明了,比如:

“我如果可以把View的最上端设置出一定高度的颜色(或者图案),具体高度只要大于等于“状态栏”高度即可,那么已经“透明”了的“状态栏”自然而然就会变成这个颜色(或者图案),而我只需要从一开始就把那种颜色设置为和ActionBar一样就可以了。”

这就好比官方只给了我面粉和肉,程序猿可以想办法做出饺子。。。由于这种变色龙式的显示需求太普遍,我们也不想每次都机械地写同样的这几十行代码,因此有大牛就写了一个开源库,只要用几行代码简单地调用这个库就够了,目前,Github上就有这样一个jar开源库:SystemBarTint,国内很多开发者就可以简单地使用并达到“变色”效果了,当然了,还有其他很多的方法也能达到这个效果(好比你做饺子,我做包子),这就是写代码的灵活。。

“变色”讲完了,在Android4.4中,我们看似简单的变色,其实实现起来并没有“透明”那么简单。

有些人所说的“彩色状态栏”和“单色状态栏”,在4.4中实现原理都是“透明”!!而不是你们自己理解的一个是“透明”,一个是“变色”。。

Google似乎也意识到了这一点,于是在Android5.0(API 21)中,加入了一个新的特性;单独设置“状态栏”颜色!!(即colorPrimaryDark)

,与此同时,ActionBar升级成了ToolBar,其颜色标签为colorPrimary。。

从字面区别Dark上看,Google似乎推荐我们把“状态栏”的颜色设置地比ToolBar更深一点,当然,决定权在程序猿手里,你甚至能设置成两个风马牛不相及的颜色,结果显然会很丑喽,哈哈。

另外,有人自造了两个词“沉浸式状态栏”和“变色龙式状态栏”,自以为是地说前者是“状态栏”和ToolBar颜色一模一样,后者则是一深一浅。。纯属无稽之谈。。根本没这两个概念。。那只不过是设置的16进制颜色RGB值一样和不一样的区别而已。。。

当然,Google推荐我们把颜色值设置成“一深一浅”,而不是一模一样。。这也是为什么很多Google官方应用在5.0及更高版本的设备上显示效果“两栏分明,一深一浅”,如图:


这时候,“变色”的原理变成了单独设置其颜色,比4.4方便很多。。


扯了这么多,我概括一下就是:官方只有“沉浸”和“透明”这两个概念,且只支持Android4.4及以上。“变色”是非官方说法,是基于“透明”演化而来,并且从实现原理上看,不论是4.4还是5.0,“变色”这种叫法都很不恰当。。最后,Android5.0引入了单独设置状态栏颜色的方法。。

并且,“沉浸”和“变色”,“沉浸”和“透明”根本半毛钱关系都没有。。

在官方文档中,“沉浸”和“全屏”是绑定的。。

很多人的误传也就来源于这里。。



接下来说到“全屏”,于是又来了一个争议点,“全屏”到底是Android4.X哪个版本引入的,有人说4.0,有人说4.1,有人斩钉截铁的说是4.4。

官方叫法中,“全屏”(FULLSCREEN)从1.X时代过来一直都有,只不过4.0之前只能隐藏“状态栏”(那是因为4.0之前没有“导航栏”,哈哈哈哈哈哈),4.0开始出现“导航栏”,很多人认为,Google这个时候还没有允许用户隐藏它,直到4.4时代,Google才开放了这个接口,实际不然:

Google在4.0时(亦或是4.1)已经可以隐藏“导航栏”(即虚拟按键)进入完全全屏模式了,只不过这种全屏无法实现再次隐藏,如果不小心把“导航栏”滑出来,需要退出该Activity重新进入才能再次全屏。。举例:某云直播app在2014年的某版本没有root权限即可实现“全屏”。

其中一种实现代码是:

int x = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN;

decorView.setSystemUiVisibility(x);

当然,这种方法在4.4得到了加强,也就是更强大的全屏方案---“沉浸”!!

具体是在setSystemUiVisibility()方法里面加入了两个新的flag: View.SYSTEM_UI_FLAG_IMMERSIVE和View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY

结论:“全屏”并非4.4才引入的,4.0即可实现!但是真正稳定的“全屏”模式是“沉浸”!!只有这个模式才是完美全屏(支持手动和自动隐藏,而不用退出重进),且必须Android4.4及以上版本。

这就是争议点的来源,(“沉浸”具体分两种,一般我们遇到的属于自动隐藏型,即带有Sticky粘性标签的“沉浸”,就不展开了。)。

“沉浸”的特点是一定是在第一次进入会有两个蓝色提示气泡。

至此为止,应该没人搞混“沉浸”和“变色”了吧。

“沉浸”是属于“全屏”的,是一种相对来说更加完美的“全屏”模式,和“透明”没有关系,唯一一样的是都需要Android4.4及更高版本。。