Android 史上最简单的,最新的 沉浸式设置

784 阅读2分钟

相关参考

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)

image.png

2.2 app的内容扩展到状态栏和导航栏,并且状态栏和导航栏透明

image.png

        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的内容扩展到状态栏和导航栏,并且状态栏和导航栏隐藏

image.png

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
        }