Android应用中经常会有一些要求全屏显隐状态栏导航栏的需求。通过全屏沉浸式的处理可以让应用达到更好的显示效果。下面系统的讲解一下有关全屏,隐藏状态栏导航栏,沉浸式的知识。
获取状态栏高度
新建一个StatusBarUtils.java文件,在里面添加一个获取状态栏高度的方法,以后我们都会用的到这个方法。之后我们的核心代码也在这个工具类里实现。代码如下:
public class StatusBarUtils {
public static int getHeight(Context context) {
int statusBarHeight = 0;
try {
int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen",
"android");
if (resourceId > 0) {
statusBarHeight = context.getResources().getDimensionPixelSize(resourceId);
}
} catch (Exception e) {
e.printStackTrace();
}
return statusBarHeight;
}
}
设置全屏
在Android4.1以及更高版本可以使用setSystemUiVisibility来控制SystemUI,为了更系统的讲解,不分别按照效果来讲,而是把用到的flag先列出来一起讲。以下flag经过互相组合能达到全屏隐藏状态栏,全屏隐藏导航栏,全屏显示状态栏导航栏等很多不同效果。
控制SystemBar相关:
- SYSTEM_UI_FLAG_FULLSCREEN
- SYSTEM_UI_FLAG_HIDE_NAVIGATION
- SYSTEM_UI_FLAG_LOW_PROFILE
布局相关:
- SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
- SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
- SYSTEM_UI_FLAG_LAYOUT_STABLE
沉浸式相关 (4.4 引入):
- SYSTEM_UI_IMMERSIVE
- SYSTEM_UI_IMMERSIVE_STICKY
控制 SystemBar 相关
SYSTEM_UI_FLAG_FULLSCREEN
该属性是用来隐藏状态栏的。
public static void hideStatusBar(@NonNull Window window, @ColorInt int color) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
int uiOption=View.SYSTEM_UI_FLAG_FULLSCREEN;
//调用该方法,状态栏将变成隐藏,状态栏将变成纯黑色
window.getDecorView().setSystemUiVisibility(uiOption);
}
}
效果图如下,注意看顶部状态栏
![](https://i-blog.csdnimg.cn/blog_migrate/adb0b147fdc9f820091bebfe3588318a.gif)
SYSTEM_UI_HIDE_NAVIGATION
该属性是用来隐藏导航栏的,
- 点击任意布局中的任意位置都会导致导航栏导航栏重新显示出来
- 并且布局也会随着状态栏导航栏的显隐进行布局调整进行重绘。
public static void hideNavigationBar(@NonNull Window window, @ColorInt int color) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
int uiOption = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
window.getDecorView().setSystemUiVisibility(uiOption);
}
}
效果图如下,注意看底部导航栏
SYSTEM_UI_LOW_PROFILE
这个属性的能力是让SystemBar在视觉上变得模糊,重要性变得更低一点。具体表现是状态栏图标仅保留电量时间关键图标,并且变暗。导航栏图标变成三个点或者变暗。这个flag使用的很少。
View decorView = getWindow().getDecorView();
int uiOption = View.SYSTEM_UI_FLAG_LOW_PROFILE;
decorView.setSystemUiVisibility(uiOption);
布局相关
在新的Android4.1以及之后新的SystemUI设置里,仅单独设置隐藏状态栏和导航栏的flag会导致布局重绘,为了在显隐状态栏和导航栏的时候保持布局的稳定的显示效果,就需要以下属性了。
SYSTEM_UI_FLAG_LAYOUT_STABLE
该flag的作用是保持布局稳定,避免在显隐状态栏导航栏的时候发生布局的变化。可以辅助以下SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN、SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION两个flag的使用,让应用保持全屏的情况下,布局不随状态栏导航栏显隐发生变化。也可以不配合这两个flag使用,也能达到保持布局稳定的效果,不过不能实现全屏,会留出状态栏和导航栏的位置。
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
可以让布局延伸到状态栏的位置。在状态栏在隐藏和显示之前切换的时候,布局稳定的显示在状态栏后面(如果显示状态栏则布局在状态栏后面,隐藏状态栏布局也不变)。
- 当滑动systembar、点击home键menu键就会清除掉flag。状态栏会重新显示出来
- 布局不会随着状态栏的显隐进行调整变化
SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
可以让布局延伸到导航栏的位置。可以让导航栏在隐藏和显示之前切换的时候,布局稳定的显示在导航栏后面(如果显示导航栏则在导航栏后面,隐藏导航栏也不变)。
- 点击任意布局就会清除掉flag。状态栏导航栏会重新显示出来
- 布局不会随着状态栏导航栏的显隐进行调整变化。
参考链接