Managing System UI
标签: UI SystemBar
调暗系统Bars
Android4.0(API level 14)及以上使用
此方法不会导致内容大小的变化,它只是简单的将系统Bars(状态栏跟导航栏)模糊处理,一旦用户点击屏幕,将会恢复正常。目的是为了让用户更加专注于APP的内容中。
当点击导航栏、导航栏上滑、状态栏下滑、弹出菜单等操作时,标志被清除。
使用:
View decorView = getActivity().getWindow().getDecorView();
int uiOptions = View.SYSTEM_UI_FLAG_LOW_PROFILE;
decorView.setSystemUiVisibility(uiOptions);
恢复也很简单,只需将uiOptions置为0
View decorView = getActivity().getWindow().getDecorView();
// Calling setSystemUiVisibility() with a value of 0 clears
// all flags.
decorView.setSystemUiVisibility(0);
此方式会引起 onSystemUiVisibilityChange()的回调
隐藏状态栏
-
Android 4.0及以下
- Android4.0及以下通过设置WindowManager标志完成,具体可以通过清单中设置FullScreen主题,比如:
<application ... android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen" > ...
```
if (Build.VERSION.SDK_INT < 16) {
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
//注意:通过此方式设置的标志需要手动清除,否则会一直作用,并且onSystemUiVisibilityChange()不会被回调
```
>通过清单配置的好处是UI过渡流畅,因为系统在Activity实例化之前就已经获取到渲染UI的信息。
- Android 4.1及以上
Android4.1及以上隐藏状态栏是通过调用
setSystemUiVisibility()
方法 ,需要注意的是,隐藏状态栏的时候需要把ToolBar也隐藏了
View decorView = getWindow().getDecorView();
// Hide the status bar.
int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);
// Remember that you should never show the action bar if the
// status bar is hidden, so hide that too if necessary.
ActionBar actionBar = getActionBar();
actionBar.hide();
注意:通过此方式隐藏状态栏,当按下home键或者弹出对话框等,标志会被清除,
onSystemUiVisibilityChange()
会被调用,点击屏幕不会清除标志
隐藏导航栏
Android4.0(API level 14)
通常来说,在隐藏导航栏的时候,需要一并将状态栏隐藏。
View decorView = getWindow().getDecorView();
// Hide both the navigation bar and the status bar.
// SYSTEM_UI_FLAG_FULLSCREEN is only available on Android 4.1 and higher, but as
// a general rule, you should design your app to hide the status bar whenever you
// hide the navigation bar.
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);
注意:此时点击屏幕、菜单、home键、显示Dialog等操作,标记即被清,
onSystemUiVisibilityChange()
会被调用
沉浸模式
Android4.4(API level 19)
引入SYSTEM_UI_FLAG_IMMERSIVE
,这个标志可以让我们真正实现全屏模式,为什么这么说呢?因为前面隐藏导航栏跟状态栏时,点击屏幕后标志就会被清除,而在这三者配合使用后,可以使我们捕获屏幕所有的触碰事件,此时点击屏幕并不会清除标志,除非我们从状态栏下滑,或者从导航栏上滑,这才会清除标志,并且会触发onSystemUiVisibilityChange()
回调。
另外,如果我们需要在标志被清除后可以自动再次全屏,将SYSTEM_UI_FLAG_IMMERSIVE
替换为SYSTEM_UI_FLAG_IMMERSIVE_STICKY
即可,但是需要注意的是,由于使用此标志之后,系统Bars只是在半透明状态下短暂地显示,所以并不会触发onSystemUiVisibilityChange()
回调。
用法:
// This snippet hides the system bars.
private void hideSystemUI() {
// Set the IMMERSIVE flag.
// Set the content to appear under the system bars so that the content
// doesn't resize when the system bars hide and show.
mDecorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
| View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
| View.SYSTEM_UI_FLAG_IMMERSIVE);
}
// This snippet shows the system bars. It does this by removing all the flags
// except for the ones that make the content appear under the system bars.
private void showSystemUI() {
mDecorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}
添加回调
通过给View注册
View.OnSystemUiVisibilityChangeListener
来响应UI变化
前面多次提及的onSystemUiVisibilityChange()
便是View.OnSystemUiVisibilityChangeListener
接口中的方法
View decorView = getWindow().getDecorView();
decorView.setOnSystemUiVisibilityChangeListener
(new View.OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int visibility) {
// Note that system bars will only be "visible" if none of the
// LOW_PROFILE, HIDE_NAVIGATION, or FULLSCREEN flags are set.
if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
// TODO: The system bars are visible. Make any desired
// adjustments to your UI, such as showing the action bar or
// other navigational controls.
} else {
// TODO: The system bars are NOT visible. Make any desired
// adjustments to your UI, such as hiding the action bar or
// other navigational controls.
}
}
});