相关参考
Window 篇—— WindowInsets 与 fitsSystemWindow
一.android 5.0之前设置沉浸式
因为在5.0之前不能直接设置状态栏和导航栏的背景色,
所以要使用
android:android:windowTranslucentStatus
android:windowTranslucentNavigation
配合fitsSystemWindows 来实现沉浸式
android:windowTranslucentStatus和windowTranslucentNavigation将状态栏和导航栏的颜色设置为透明,并且app的内容扩展到状态栏,然后给作为标题的View设置fitsSystemWindows,让标题给View标题栏预留空间
现在minsdk都是21了,所以5.0之前我们不考虑了
二.android 5.0之后设置沉浸模式
因为5.0之后可以设置直接设置状态栏和导航栏的颜色,那么设置沉浸模式就简单多了
以下几种沉浸模式
其实就是Window transfer flags和状态栏颜色设置的配合使用
2.1 状态栏和导航栏的颜色和主题色一样
window.statusBarColor = getColor(android.R.color.holo_purple)
window.navigationBarColor = getColor(android.R.color.holo_purple)
2.2 app的内容扩展到状态栏和导航栏,并且状态栏和导航栏透明
window.statusBarColor = Color.TRANSPARENT
window.navigationBarColor = Color.TRANSPARENT
window.decorView.systemUiVisibility =
View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or //应用内容扩展到状态栏
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or//应用内容扩展到导航栏
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY //沉浸模式,用户可以交互的界面。同时,用户上下拉系统栏时,会自动隐藏系统栏
我们可以发现在API 11及其以上 Window Tranfer flag已经过时了,我们使用如下的方法
window.statusBarColor = Color.TRANSPARENT
window.navigationBarColor = Color.TRANSPARENT
WindowCompat.setDecorFitsSystemWindows(window,false)
它相当于
if (Build.VERSION.SDK_INT >= 30) {
window.setDecorFitsSystemWindows(false);
} else if (Build.VERSION.SDK_INT >= 16) {
final int decorFitsFlags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
final View decorView = window.getDecorView();
final int sysUiVis = decorView.getSystemUiVisibility();
decorView.setSystemUiVisibility(decorFitsSystemWindows
? sysUiVis & ~decorFitsFlags
: sysUiVis | decorFitsFlags);
}
2.3 app的内容扩展到状态栏和导航栏,并且状态栏和导航栏隐藏
window.statusBarColor = Color.TRANSPARENT
window.navigationBarColor = Color.TRANSPARENT
window.decorView.systemUiVisibility =
View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or //应用内容扩展到状态栏
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or//应用内容扩展到导航栏
View.SYSTEM_UI_FLAG_FULLSCREEN or // 隐藏状态栏
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION //隐藏导航栏
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY //沉浸模式,用户可以交互的界面。同时,用户上下拉系统栏时,会自动隐藏系统栏
在API 11及其以上 Window Tranfer flag一斤过时了,我们使用如下的方法
window.statusBarColor = Color.TRANSPARENT
window.navigationBarColor = Color.TRANSPARENT
//内容扩展到状态栏
WindowCompat.setDecorFitsSystemWindows(window, false)
ViewCompat.getWindowInsetsController(window.decorView)?.run {
//隐藏系统栏
this.hide(WindowInsetsCompat.Type.statusBars())
this.hide(WindowInsetsCompat.Type.navigationBars())
//系统栏的行为:滑动显示系统栏
this.systemBarsBehavior = BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
}