ErQi

4.4状态栏沉浸

4.4状态栏的沉浸兼容

沉浸式状态栏

关于状态栏的沉浸,网上资料很多,可以如下几种

Style沉浸

基于NoActionBar主题的,所以在AndroidManifest文件中的Activity要做对应的修改.
在style-19中设置状态栏沉浸

1
2
3
4
5
<resources>
<style name="AppTheme" parent="@style/BaseAppTheme">
<item name="android:windowTranslucentStatus">true</item>
</style>
</resources>

代码沉浸

1
2
3
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}

开源库沉浸

SystemBarTint

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 创建状态栏的管理实例
SystemBarTintManager tintManager = new SystemBarTintManager(this);
// 激活状态栏设置
tintManager.setStatusBarTintEnabled(true);
// 激活导航栏设置
tintManager.setNavigationBarTintEnabled(true);
// 设置一个颜色给系统栏
tintManager.setTintColor(Color.parseColor("#99000FF"));
// 设置一个样式背景给导航栏
tintManager.setNavigationBarTintResource(R.drawable.my_tint);
// 设置一个状态栏资源
tintManager.setStatusBarTintDrawable(MyDrawable);
}

总结

style方式和代码设置,本质上是殊途同归,只有极个别界面需要沉浸时建议使用代码,页面都需要沉浸时建议使用style,简单省事.
两者都是讲界面的整体布局沉浸到状态栏,所以布局的原点是位于屏幕的左上角的原点,并非是状态栏下方的原点.
需要在布局中使用android:fitsSystemWindows="true"该属性无他,就是将该布局在计算长度的时,自动加上一截状态栏的长度,避免内容信息沉浸到状态栏.

看到贴吧有人通过动态添加一个状态栏的View的高度,并设置颜色.
更多的是使用SystemBarTint.

我的方案

使用Style进行整体沉浸,然后再界面根布局沉浸,设置好对应状态栏的背景色,已达到沉浸的效果.


真正的沉浸式

真正的沉浸式不是简单的将背景沉浸到状态栏,而是隐藏掉整个状态来,还有导航栏,比如各种手机视频直播的全屏模式,那才是真正的沉浸式,将整个界面全部沉浸进去,隐藏掉外层的状态栏,导航栏.

官方的沉浸

在新建项目的时候可以看到Activity模板中有一个就是FullScreen,我就从此入手,来了解真正的沉浸式是如何实现的.

全屏沉浸

1
2
3
4
5
6
mContentView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);

首先真正解决全屏沉浸的是出现在19时,添加了SYSTEM_UI_FLAG_IMMERSIVE_STICKY,用于针对全屏应用更好的体验,而非像之前界面的点击时就会导致导航栏,状态栏的再度出现.
添加了该标示值时,用户在界面边缘滑动操作时,导航栏,状态栏会出现,但是在一段时间之后会自动隐藏,并不会一直出现.

需要注意的细节

在使用默认主题时,沉浸是需要注意针对ActionBar进行隐藏处理.
在隐藏Actionbar和为View添加沉浸标识时中间需要一个延缓的过渡时间,不能同时操作,不然沉浸的显示会出现问题,界面展示为:丢失ActionBar的高度,View整体向上移动了丢失的高度,然后导致底端一部分显示纯黑背景.

拓展略读

管理系统UI之四:使用全屏沉浸模式(Using Immersive Full-Screen Mode)