在开发透明状态栏的时候,会使用到这段代码(来自郭霖的博客):
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_FULLSCREEN
-
SYSTEM_UI_FLAG_HIDE_NAVIGATION
隐藏导航栏,布局会往下移。如果用户进行操作,导航栏会立马出现并清除该flag。
SYSTEM_UI_FLAG_HIDE_NAVIGATION
-
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_IMMERSIVE_STICKY | SYSTEM_UI_FLAG_HIDE_NAVIGATION | SYSTEM_UI_FLAG_FULLSCREEN
-
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变暗。
回过头再看开始的代码
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已经占到了整个屏幕,但是被状态栏和导航栏覆盖在下层。
![](https://img.haomeiwen.com/i6532223/2acc35ad832f13ff.png)
这时,再设置状态栏和导航栏的颜色为透明,即可实现透明状态栏/沉浸式的效果了。当知道了这些flag的作用之后,要实现其他效果也是很轻松了。比如看视频的时候,就可以设置SYSTEM_UI_FLAG_IMMERSIVE_STICKY | SYSTEM_UI_FLAG_HIDE_NAVIGATION | SYSTEM_UI_FLAG_FULLSCREEN,就可以实现全屏沉浸式观看的效果了。
网友评论