1. 官网原文
Android Doc原文地址public void setSystemUiVisibility (int visibility)
Request that the visibility of the status bar or other screen/window decorations be changed.
This method is used to put the over device UI into temporary modes where the user’s attention is focused more on the application content, by dimming or hiding surrounding system affordances. This is typically used in conjunction with Window.FEATURE_ACTION_BAR_OVERLAY, allowing the applications content to be placed behind the action bar (and with these flags other system affordances) so that smooth transitions between hiding and showing them can be done.
Two representative examples of the use of system UI visibility is implementing a content browsing application (like a magazine reader) and a video playing application.
这个方法用于改变状态栏或者其他系统UI的可见性。
这个方法通过变暗或隐藏系统组件,将设备上层UI置于临时模式,使得用户能够将更多的注意力集中在App的内容上。它通常和Window.FEATURE_ACTION_BAR_OVERLAY联合使用,让App的内容显示在ActionBar之后,使其显示和隐藏之间的动画更为平滑。
两个设置系统UI可见性的例子是内容浏览(如杂志阅读器)和视频播放。
2. 参数解析
在开发透明状态栏的时候,会使用到这段代码(来自郭霖的博客):
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (Build.VERSION.SDK_INT >= 21) {
View decorView = getWindow().getDecorView();
int option = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
decorView.setSystemUiVisibility(option);
getWindow().setNavigationBarColor(Color.TRANSPARENT);
getWindow().setStatusBarColor(Color.TRANSPARENT);
}
ActionBar actionBar = getSupportActionBar();
actionBar.hide();
会用是知其然,但是要知其所以然。那么,这个setSystemUiVisibility方法传入的这个参数,到底起到什么作用呢?
- SYSTEM_UI_FLAG_FULLSCREEN
全屏模式,占据整个屏幕,隐藏状态栏等界面,不过导航栏不会隐藏。如果用户进行操作,隐藏的系统界面会立马出现并清除该flag。 - SYSTEM_UI_FLAG_HIDE_NAVIGATION
隐藏导航栏,布局会往下移。如果用户进行操作,导航栏会立马出现并清除该flag。 - SYSTEM_UI_FLAG_IMMERSIVE
和SYSTEM_UI_FLAG_HIDE_NAVIGATION共同使用,使用户操作不再显示导航栏(但是仍能通过从底部往上滑调出导航栏并清除flag)。单独使用无效。 - SYSTEM_UI_FLAG_IMMERSIVE_STICKY
和SYSTEM_UI_FLAG_FULLSCREEN以及SYSTEM_UI_FLAG_HIDE_NAVIGATION共同使用。用户操作不再清除flag,从边缘滑入可以调出状态栏和导航栏,并且过几秒之后自动隐藏。单独使用无效。 - SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN和SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
不隐藏状态栏和导航栏,但是app会按照已经隐藏了那样布局。也就是说,布局会顶上去(占满屏幕),但是会被状态栏/导航栏遮盖住。 - SYSTEM_UI_FLAG_LAYOUT_STABLE
布局变的“稳定”,在状态栏或者导航栏变化的时候不会被顶上去或者顶下去了。
事实上,当同时设置了SYSTEM_UI_FLAG_FULLSCREEN和SYSTEM_UI_FLAG_LAYOUT_STABLE之后,效果相当于SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN。 - SYSTEM_UI_FLAG_LOW_PROFILE
使系统界面不那么“显眼”,用于沉浸式体验。会使状态栏、导航栏等系统UI变暗。
3. 合理利用
回过头再看开始的代码
uper.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (Build.VERSION.SDK_INT >= 21) {
View decorView = getWindow().getDecorView();
int option = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
decorView.setSystemUiVisibility(option);
getWindow().setNavigationBarColor(Color.TRANSPARENT);
getWindow().setStatusBarColor(Color.TRANSPARENT);
}
ActionBar actionBar = getSupportActionBar();
actionBar.hide();
在普通情况下,整个手机界面从上到下依次是:状态栏、appUI、虚拟导航栏。当设置了SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION和SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN两个flag之后,实际上appUI已经占到了整个屏幕,但是被状态栏和导航栏覆盖在下层。
这时,再设置状态栏和导航栏的颜色为透明,即可实现透明状态栏的效果了。
当知道了这些flag的作用之后,要实现其他效果也是很轻松了。比如看视频的时候,就可以设置SYSTEM_UI_FLAG_IMMERSIVE_STICKY | SYSTEM_UI_FLAG_HIDE_NAVIGATION | SYSTEM_UI_FLAG_FULLSCREEN,就可以实现全屏沉浸式观看的效果了。