一、为什么需要实现沉浸式
状态栏和界面的风格不一样会让用户的体验下降很多,为了提高用户的体验所以需要实现沉浸式。
二、各个版本实现沉浸式的方式
-
3.0(API 11)
在3.0之前,我们并没有一个专门针对状态栏进行操作的API。而如果我们想要要隐藏状态栏来达到全屏效果,只能通过对Window设置全屏标签获得。后来在Android 3.0版本(API 11)上,View中加入了一个void setSystemUiVisibility (int visibility) 方法。随着该方法一同出来的有两个属性:STATUS_BAR_HIDDEN、STATUS_BAR_VISIBLE。并且还加入了View.OnSystemUiVisibilityChangeListener来监听系统UI的变化。至此Android开启了可以对状态栏进行操作的时代,也为以后的各种花样玩法打下了基础。不过在3.0上你能操作的也只有显示或隐藏状态栏了,并无其他。 -
4.0(API 14)
后来在4.0上,扩充了针对状态栏操作的功能,把3.0种加入的STATUS_BAR_HIDDEN 换成了SYSTEM_UI_FLAG_LOW_PROFILE , STATUS_BAR_VISIBLE 也换成了 SYSTEM_UI_FLAG_VISIBLE。另外还加入了SYSTEM_UI_FLAG_HIDE_NAVIGATION这个新标签。开发者对系统UI的控制权进一步加强。
SYSTEM_UI_FLAG_LOW_PROFILE 被称为低调模式,我们可以设置该标签让状态栏或导航栏上的图标变暗和让一些不重要的图标消失。适用一些全屏操作,比如游戏,阅读等。我们来看下设置该标签后的效果。
SYSTEM_UI_FLAG_HIDE_NAVIGATION 故名思意就是可以通过设置该标签,使得底部的导航栏隐藏。Android也正是从4.0版本开始可以对底部导航栏进行操作的。同样如果用户与页面有任何交互,该标签会被清除,样式会还原。 -
4.1(API 16)
在4.1版本中,Android团队进一步强化了setSystemUiVisibility的作用,又在4.0的基础上增加了以下一些属性:
SYSTEM_UI_FLAG_FULLSCREEN 全屏状态,视觉上的作用和WindowManager.LayoutParams.FLAG_FULLSCREEN一样。如果你的应用只是某几个页面需要使用全屏模式,建议使用该标签来设置。因为此标签更容易清除。
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN / SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
这两个属性和上面提到的FULLSCREEN和HIDE_NAVIGATION属性很像,只是多了一个LAYOUT。区别是,这两个属性并不会真正隐藏状态栏或者导航栏,只是把整个content的可布局区域延伸到了其中。如下所示Toolbar的布局已经延伸到了状态栏下面。
SYSTEM_UI_FLAG_LAYOUT_STABLE 此View一般和上面几个提到的属性一起使用,它可以保证在系统控件隐藏显示时,不会让本view重新layout。也就是你手动隐藏状态栏或导航栏时,所有的view也都待在本来的位置上不会动。 -
4.4(API 19)
从Android 4.4 开始,我们才能真正做到以上这种效果,在API 19上加入了以下两个风格属性,使用这两种属性,可以设置状态栏或者导航栏的背景为透明。
android:windowTranslucentStatus
android:windowTranslucentNavigation
除了上面两个属性外,另外在API 19中还加入了两个标签
SYSTEM_UI_FLAG_IMMERSIVE 正如前面所说的 SYSTEM_UI_FLAG_HIDE_NAVIGATION和SYSTEM_UI_FLAG_FULLSCREEN在用户与屏幕有任何交互时,都会被清除。过后如需隐藏目的,又得重新设置。而此标签正是防止这种情况而加入,设置此标签后,只有从屏幕上方下滑,或者从屏幕下方上滑时才会执行清除,其他普通交互不会变化。
SYSTEM_UI_FLAG_IMMERSIVE_STICKY 该标签与SYSTEM_UI_FLAG_IMMERSIVE作用差不多,只是该标签会让SYSTEM_UI_FLAG_HIDE_NAVIGATION和SYSTEM_UI_FLAG_FULLSCREEN 标签被短暂清除,而不是永久,一会儿后又会自动恢复。
- 5.0(API 21)
从第一次可以操作状态栏的3.0版本(2011年发布)到可以设置状态栏的颜色的5.0版本(2014年发布),已经过去了漫长的3年时间,这三年间,开发者门根本没法实现一个体验比较完美的沉浸式应用。到5.0版本,加入了以下两个属性。
android:statusBarColor
android:navigationBarColor
- 6.0(API 23)
6.0上加入了SYSTEM_UI_FLAG_LIGHT_STATUS_BAR标签和android:windowLightStatusBar风格属性,终于你可以改变状态栏中的内容颜色了。设置后,状态栏的内容会变成暗色调,这样即使在浅色的背景上显示,也一样能看清了,如下