Android系统栏相关(SystemBar)
基础知识,仅作备忘
SystemBar是用来展示通知、表现设备状态和完成设备导航的屏幕区域。主要包括状态栏(1:status bar)和导航栏(2:navigation bar)。借用官方的图,如下所示,我们可以根据需要对SystemBar进行一些操作,满足自己的需求。
淡化SystemBar (View.SYSTEM_UI_FLAG_LOW_PROFILE)
从API14,即4.0开始,我们可以借助View.SYSTEM_UI_FLAG_LOW_PROFILE
来淡化SystemBar,以突出内容区域。
当你使用这个方法的时候,内容区域的大小并不会发生变化,只是系统栏的图标会收起来。一旦用户触摸状态栏或者是导航栏的时候,这两个系统栏就又都会完全显示(无透明度)。
这种方法的优势是SystemBar仍然可见,但是它们的细节被隐藏掉了,因此可以在不牺牲快捷访问系统栏的情况下创建一个沉浸式的体验。
设置代码:
mView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);
如图所示:
一旦用户触摸到状态栏或者是系统栏,这个标签就会被清除,使系统栏重新显现(无透明度)。在标签被清除的情况下,如果你想重新淡化系统栏就必须重新设定这个标签。
或者我们也可以通过代码直接清除该标志:
mView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
如图所示:
View.SYSTEM_UI_FLAG_VISIBLE
表示请求系统显示SystemBar.
隐藏SystemBar
在Api15及其之下,可以通过设置Window的Flag标志来达到全屏目的,一般两个标志位同时设置:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN)
WindowManager.LayoutParams.FLAG_FULLSCREEN
设置全屏模式,隐藏窗口装饰。除了动态设置外,还可以在主题中设置windowFullscreen属性来达到全屏目的。
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
设置了FLAG_LAYOUT_IN_SCREEN之后,可以拥有与启用FLAG_FULLSCREEN相同的屏幕区域。这个方法防止了状态栏隐藏和显示时,内容区域的大小变化。但是此时,状态栏应该是在压在内容区域之上,所以需要自己处理布局,防止状态栏遮盖重要的内容区域。
当你设置WindowManager标签之后(无论是通过Activity主题还是动态设置),这个标签都会一直生效直到你清除它。这点和View.setSystemUiVisibility设置有本质的区别。
在Api16及其之上,可以通过View.setSystemUiVisibility来设置。该方法可以用来控制SystemBar的显示和隐藏,下面简单介绍下其可以设置的Flag:
最重要的两个Flag:
View.SYSTEM_UI_FLAG_IMMERSIVE
Api19
(控制SYSTEM_UI_FLAG_HIDE_NAVIGATION flag是否能被用户交互行为所清除)If this flag is not set, SYSTEM_UI_FLAG_HIDE_NAVIGATION will be force cleared by the system on any user interaction。如果没有设置该flag,那么任何用户交互行为都会清除SYSTEM_UI_FLAG_HIDE_NAVIGATION flag,从而导致导航栏重新显示出来。
Since this flag is a modifier for SYSTEM_UI_FLAG_HIDE_NAVIGATION,