int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN; getWindow().getDecorView() .setSystemUiVisibility(uiOptions)
setSystemUiVisibility
(int visibility)传入的实参类型如下:(
基本上可以定义为状态栏和Activity之间的位置关系
)
|
|
|
WindowManager.LayoutParams.FLAG_FULLSCREEN
|
隐藏状态栏(在代码中设置)
|
|
View.SYSTEM_UI_FLAG_VISIBLE
|
14 系统默认 显示状态栏和导航栏
状态栏和Activity共存,Activity不全屏显示。也就是应用平常的显示画面
|
|
View.
SYSTEM_UI_FLAG_FULLSCREEN
|
16 状态栏隐藏,效果同设置WindowManager.LayoutParams.FLAG_FULLSCREEN ,
Activity全屏显示,且状态栏被覆盖掉
视图全屏并隐藏状态栏,当用户交互时(如下滑状态栏)会恢复隐藏的状态栏(例子:电子书阅读)
缺点:
进入Activity会产生一个从非全屏到全屏的闪动效果 ,(
恢复状态栏视图下移
)
可以使用 SYSTEM_UI_FLAG_LAYOUT_FULLSCREE 标志,让应用的内容区域显示在状态栏的后面,还可以配合 SYSTEM_UI_FLAG_LAYOUT_STABLE 标志使用,让布局保持稳定
|
|
|
|
|
View.
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
|
16 视图延伸至状态栏区域,状态栏上浮于视图之上 (视图全屏且不会产生闪动,状态栏会覆盖在视图上面)
Activity全屏显示,但是状态栏不会被覆盖掉,而是正常显示,只是Activity顶端布局会被覆盖住
可以配合 SYSTEM_UI_FLAG_LAYOUT_STABLE 标志使用,让布局保持稳定
|
|
View.
SYSTEM_UI_FLAG_HIDE_NAVIGATION
|
隐藏导航栏
|
|
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or
View.SYSTEM_UI_FLAG_FULLSCREEN or
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
↑效果:隐藏状态栏/导航栏
|
16
视图延伸至导航栏区域,
导航栏上浮于视图之上
* 按照一个通用的规则,在隐藏导航栏的时候,一般也需要隐藏状态栏
* 通过这种方式隐藏导航栏和状态栏之后,
触摸屏幕的任何区域,导航栏和状态栏都会重新出现且不会再消失,如果想让导航栏和状态栏消失,则需要手动重新设置 UI flag
* 如果想让内容区域出现在导航栏的后面,则需要配合使用 SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 标志,并且最好配合使用 SYSTEM_UI_FLAG_LAYOUT_STABLE 使布局保持稳定
|
|
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
|
16
保持整个View稳定, 常和控制System UI悬浮, 隐藏的Flags共用, 使View不会因为System UI的变化而重新layout
保持View Layout不变,
隐藏状态栏或者导航栏后,View不会拉伸。
* 使视图稳定,当使用fitSystemWindows()需要视图稳定,一般和View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN联用
|
|
View.SYSTEM_UI_FLAG_IMMERSIVE
(需要联用,已被SYSTEM_UI_FLAG_IMMERSIVE_STIKY取代)
|
19 只有当设置了SYSTEM_UI_FLAG_HIDE_NAVIGATION才起作用。如果没有设置,任意的View相互动作都退出SYSTEM_UI_FLAG_HIDE_NAVIGATION模式。如果设置就不会退出。
沉浸模式, 隐藏状态栏和导航栏, 并且在第一次会弹泡提醒, 并且在状态栏区域滑动可以呼出状态栏(这样系统会清除之前设置的View.SYSTEM_UI_FLAG_FULLSCREEN或View.SYSTEM_UI_FLAG_HIDE_NAVIGATION标志)。使之生效,需要和View.SYSTEM_UI_FLAG_FULLSCREEN,View.SYSTEM_UI_FLAG_HIDE_NAVIGATION中的一个或两个同时设置。
|
|
View.
SYSTEM_UI_FLAG_IMMERSIVE_STIKY
(需要联用)
效果:沉浸式模式
|
19
粘性沉浸模式,只有当设置了SYSTEM_UI_FLAG_FULLSCREEN或者SYSTEM_UI_FLAG_HIDE_NAVIGATION时起作用,当使用View.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN|View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)联用时视图全屏,当用户产生交互时(如下滑状态栏)
不会恢复状态栏,只会以半透明的方式覆盖在视图上面并在一定时间内自动消失
如果没有设置,任意的View相互动作都退出SYSTEM_UI_FLAG_FULLSCREEN | SYSTEM_UI_FLAG_HIDE_NAVIGATION模式。
与上面唯一的区别是,
呼出隐藏的状态栏后不会清除之前设置的View.SYSTEM_UI_FLAG_FULLSCREEN或View.SYSTEM_UI_FLAG_HIDE_NAVIGATION标志,一段时间后将再次隐藏系统栏)
如果设置了 View.OnSystemUiVisibilityChangeListener 监听器,SYSTEM_UI_FLAG_IMMERSIVE 会触发 OnSystemUiVisibilityChangeListener 监听器,但是 SYSTEM_UI_FLAG_IMMERSIVE_STICKY
不会触发 OnSystemUiVisibilityChangeListener 监听器
|
|
View.SYSTEM_UI_FLAG_LOW_PROFILE
效果:淡化状态栏/导航栏
|
14 低调模式, 会隐藏不重要的状态栏图标 状态栏上一些图标显示会被隐藏 , 且有
淡化状态栏和导航栏的效果
一旦用户触摸 StatusBar 和 NavigationBar 相关区域,系统便清除掉了flag
|
|
View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
Android6.0系统以上增加的属性,设置了这个属性,状态栏会以与状态栏
背景颜色兼容的模式绘制(如果当前的状态栏颜色是浅色,那么就有可能造成状态栏上的图标看不清了,但是如果你设置这个属性以后,状态栏的图标就会以深色绘制)
|
int vis = decorView.getSystemUiVisibility();
if (isLightMode) {
vis |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
} else {
vis &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
}
|
|
FLAG_TRANSLUCENT_STATUS 对应↓:
|
* Android4.4系统增加的属性,它会使状态栏透明透明并且自动执行View.SYSTEM_UI_FLAG_LAYOUT_STABLE和View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
FLAG_FULLSCREEN
|
视图全屏并隐藏状态栏,效果相当于View.SYSTEM_UI_FLAG_FULLSCREEN+View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY,并且视图稳定(不会因为系统控件的变化(如输入法),而重新布局)
|
FLAG_FORCE_NOT_FULLSCREEN
|
重写了FLAG_FULLSCREEN并
强制显示状态栏(没什么用)
|
FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS
|
Android5.0系统以上支持,如果设置了该属性,系统栏(状态栏和导航栏)将以透明背景绘制,并且该窗口中的相应区域将填充setStatusBar()和setNavigationBarColor()中设置的颜色 |
FLAG_TRANSLUCENT_NAVIGATION
对应↓:
|
隐藏虚拟键(导航栏)
|
|
背景是一张图片
|
颜色跟标题栏一致
|
Android4.4~5.0
|
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
FLAG_TRANSLUCENT_STATUS这个属性会让状态栏以白色绘制,同时还会执行SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN和SYSTEM_UI_FLAG_LAYOUT_STABLE这样就会让状态栏浮在图片的上面,这样就形成了沉浸式的效果
颜色跟标题栏一致的情况 ======>
这个阶段实现的套路是,先制造一个假的View背景颜色跟标题栏的颜色一致,高度跟状态栏的高度一致,添加到顶层DecorView上面,然后让Android的最顶层的内容布局调用setFitsSystemWindows空出来状态栏的高度,最后调用FLAG_TRANSLUCENT_STATUS这个属性即可,让状态栏透明并浮在假View上
|
View statusView =
new
View(activity);
ViewGroup.LayoutParams statusViewLayoutParams =
new
ViewGroup.LayoutParams(ViewGroup.LayoutParams.
MATCH_PARENT
,
getStatusBarHeight
(activity));
ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
decorView.addView(statusView, statusViewLayoutParams);
ViewGroup rootView = decorView.findViewById(Window.
ID_ANDROID_CONTENT
);
if
(rootView !=
null
) {
rootView.setFitsSystemWindows(
true
);
}
activity.getWindow().addFlags(WindowManager.LayoutParams.
FLAG_TRANSLUCENT_STATUS
)
|
Android5.0~6.0
|
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
activity.getWindow()
.getDecorView()
.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
把状态栏的颜色设置成透明,同时让状态栏浮在视图上面且保持稳定,这样图片就会顶到视图的顶部,因此就实现了沉浸式的效果
|
方式一:直接给状态栏设置对应的颜色
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
activity.getWindow().setStatusBarColor(color);
方式二:给状态栏设置透明色并让状态栏浮在视图顶层,配合setFitsSystemWindows()
activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
toolBar.setFitsSystemWindows(true);//这里根据自己的布局情况
|
Android6.0
|
在5.0~6.0阶段发现了一个小问题,就是当我们要给状态栏设置的颜色是白色或者浅色的时候,因为默认的状态上图标的颜色是白色就会造成看不清的现象,如下图所示
为了避免这种情况,Android系统在6.0的时候增加了一个属性SYSTEM_UI_FLAG_LIGHT_STATUS_BAR,这里不再赘述,使用了它以后,状态栏上的图标文字就会默认使用黑色绘制。
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
activity.getWindow().setStatusBarColor(color);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}
|
效果
|
版本要求
|
淡化状态栏和导航栏
|
Version >= 14
|
隐藏状态栏
|
全部版本
|
隐藏导航栏
|
Version >= 16
|
沉浸式模式
|
Version >= 19
|
透明状态栏
|
Version >= 21
|