Android中的System UI Visibility
在Android中可以通过View的一些常量来改变状态栏或者屏幕的一些特性,View.setSystemUiVisibility(UiOptions)
,具体如下(隐藏系统栏和低能模式会在有app bar时失效):
View.setSystemUiVisibility(int visibility)
中,visibility是Mode与Layout任意取值的组合,可传入的实参为:
Mode
View.SYSTEM_UI_FLAG_LOW_PROFILE
:状态栏显示处于低能显示状态(low profile模式),状态栏上一些图标显示会被隐藏。
View.SYSTEM_UI_FLAG_FULLSCREEN
:Activity全屏显示,且状态栏被隐藏覆盖掉。等同于WindowManager.LayoutParams.FLAG_FULLSCREEN
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
:隐藏虚拟按键(导航栏)。有些手机会用虚拟按键来代替物理按键。
View.SYSTEM_UI_FLAG_IMMERSIVE
:这个flag只有当设置了SYSTEM_UI_FLAG_HIDE_NAVIGATION
才起作用。如果没有设置这个flag,任意的View相互动作都退出SYSTEM_UI_FLAG_HIDE_NAVIGATION
模式。如果设置就不会退出。
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
:这个flag只有当设置了SYSTEM_UI_FLAG_FULLSCREEN | SYSTEM_UI_FLAG_HIDE_NAVIGATION
时才起作用。如果没有设置这个flag,任意的View相互动作都坏退出SYSTEM_UI_FLAG_FULLSCREEN | SYSTEM_UI_FLAG_HIDE_NAVIGATION
模式。如果设置就不受影响。
Layout
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
: 保持View Layout不变,隐藏状态栏或者导航栏后,View不会拉伸。
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
:让View全屏显示,Layout会被拉伸到StatusBar下面,不包含NavigationBar。
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
:让View全屏显示,Layout会被拉伸到StatusBar和NavigationBar下面。
例如:
public void updateSystemUI() {
int visibility = 0;
for (int i = 0; i < mCheckControls.length; i++) {
if (mCheckControls[i].isChecked()) {
visibility |= mCheckFlags[i];
}
}
mImage.setSystemUiVisibility(visibility);
}
通过Window flag 和 Theme(通过设置Widnow flag修改属性)
WindowManager.LayoutParams.FLAG_FULLSCREEN
:隐藏状态栏全屏显示Window并且会拉伸。可以通过theme中的android.R.attr.windowFullscreen
来控制。
WindowManager.LayoutParams.FLAG_LAYOUT_IN_OVERSCAN
:允许window contents扩展到屏幕中的缩放区域内,如果有缩放区域的话。 可以通过theme中android.R.attr.windowOversca
来控制。
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
:使状态栏透明同时会拉伸window到全屏的状态(保留NavigationBar高度),假如有ActionBar,ActionBar依旧会显示。可以通过theme中的android.R.attr.windowTranslucentStatus
来控制。
WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION
:NavigationBar透明同时会拉伸Window到全屏(不保留StatusBar和NavigationBar的高度)。可以通过theme中的android.R.attr#windowTranslucentNavigation
来控制。
代码中使用Window flag:
private void setFullscreen(boolean on) {
Window win = getWindow();
WindowManager.LayoutParams winParams = win.getAttributes();
final int bits = WindowManager.LayoutParams.FLAG_FULLSCREEN;
if (on) {
winParams.flags |= bits;
} else {
winParams.flags &= ~bits;
}
win.setAttributes(winParams);
}
Window Feature
通过requestFeature来设置Window相关的显示状态。
getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
常见Flag:1. Window.FEATURE_ACTION_BAR_OVERLAY
:请求ActionBar覆盖在window content上面。
2.DEFAULT_FEATURES
:系统默认状态,一般不需要指定
3.FEATURE_CONTEXT_MENU
:启用ContextMenu,默认该项已启用,一般无需指定
4.FEATURE_CUSTOM_TITLE
:自定义标题。当需要自定义标题时必须指定。如:标题是一个按钮时
5.FEATURE_INDETERMINATE_PROGRESS
:不确定的进度
6.FEATURE_LEFT_ICON
:标题栏左侧的图标
7.FEATURE_NO_TITLE
:没有标题
8.FEATURE_OPTIONS_PANEL
:启用“选项面板”功能,默认已启用。
9.FEATURE_PROGRESS
:进度指示器功能
10.FEATURE_RIGHT_ICON
:标题栏右侧的图标
可以参考android官方API Demos查看具体效果,点击Views - System UI Visibility - System UI Modes :
Screenshot_1508730903.png