沉浸式状态栏是从IOS流行起来的,毕竟整个界面设计的比较完美话,上面有个白条的话比较违和。然后android也慢慢流行起来。所以较早版本的android不支持沉浸式状态栏。
我们先看一下如果不设置状态栏的app界面(theme为NoActionBar):
是不是看到上面的状态栏比较违和?
样式一:
实现代码如下:
if (Build.VERSION.SDK_INT >= 21) {
View decorView = getWindow().getDecorView();
int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
decorView.setSystemUiVisibility(option);
getWindow().setStatusBarColor(Color.TRANSPARENT);
}
// 如果theme是NoActionBar或者NoActionBar的子theme,如果添加下面两行代码会报异常
// ActionBar actionBar = getSupportActionBar();
// actionBar.hide();
然后我们看一下效果图,就会发现另一个问题:titleBar覆盖了状态栏
下一步我们要测量一下状态栏的高度并且设置titleBar的位置,实现代码如下:
测量状态栏的高度:
private int getStatusBarHeight() {
Class<?> clazz = null;
Object obj = null;
Field field = null;
int x = 0;
try {
clazz = Class.forName("com.android.internal.R$dimen");
obj = clazz.newInstance();
field = clazz.getField("status_bar_height");
x = Integer.parseInt(field.get(obj).toString());
return getResources().getDimensionPixelSize(x);
} catch (Exception e) {
e.printStackTrace();
return 75;
}
}
动态设置titleBar的位置:
int statusBarHeight = getStatusBarHeight();
Log.e("yushan", "statusBarHeight:" + statusBarHeight);
title = (RelativeLayout)findViewById(R.id.title);
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) title.getLayoutParams();
lp.topMargin = statusBarHeight;
title.setLayoutParams(lp);
最后咱们再看一下效果图:
哒哒,现在的效果是不是看着比较舒服~当然,有少数需求会把底部导航栏也渲染成同样的背景,实现代码如下:
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);
}
// 如果theme是Theme.AppCompat.Light.NoActionBar或者子theme,如果添加下面两行代码会报异常
// ActionBar actionBar = getSupportActionBar();
// actionBar.hide();
效果图咱们就不贴了,可以自己运行一下看看。注意:沉浸式状态栏要在android5.0以上才会实现。
这里道长找了一个4.2的机子运行了一下,效果图如下:
样式二
当然还有的应用感觉状态栏也没有必要展示,比如一些视频播放类应用。实现代码如下:
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus && Build.VERSION.SDK_INT >= 19) {
View decorView = getWindow().getDecorView();
decorView.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
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}
}
效果图如下:
关于沉浸式状态栏就说这么多吧,一般这么多就可以应对绝大多数需求了。希望这篇博客能够为小伙伴们提供一些帮助。