【UI篇】Android 沉浸式状态栏的那些事

这篇具有很好参考价值的文章主要介绍了【UI篇】Android 沉浸式状态栏的那些事。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


此篇文章介绍的内容都是考虑到5.0 版本以上。5.0以下的不做介绍。演示的代码皆为kotlin实现
首先一般设置是包括两方面的,第一是设置 window.decorView.systemUiVisibility ,第二是设置 window.addFlags() 这些方法都有一些常量的设置。但是在API 30 版本之后又新出了一个 WindowInsetsControllerCompat 的类,用来提供一个统一的一些操作。

window.decorView.systemUiVisibility 的参数常量

参考: 传送门
能够造成SystemUI Flag被系统自动清除的交互分类

  • 1、触摸屏幕任何位置
  • 2、顶部下拉状态栏
  • 3、底部上拉导航栏
  • 4、Window的变化(如:跳转到其他界面、弹出键盘等)

1.View.SYSTEM_UI_FLAG_HIDE_NAVIGATION:(>=api16)

作用是隐藏系统NavigationBar。
但是用户的任何交互,都会导致此Flag被系统清除,进而导航栏自动重新显示,同时View.SYSTEM_UI_FLAG_FULLSCREEN也会被自动清除,因此StatusBar也会同时显示出来。

2.View.SYSTEM_UI_FLAG_FULLSCREEN:(>=api16)

作用是隐藏StatusBar。
和WindowManager.LayoutParams.FLAG_FULLSCREEN有相同视觉效果。不同在于,此Flag一般用在暂时需要全屏的情形(如:阅读应用,全屏视频等),以便让用户的注意力暂时集中在内容上,而如果只是简单的需要一直停留在全屏状态(如:游戏应用),使用WindowManager.LayoutParams.FLAG_FULLSCREEN则是更好的选择。
此Flag会因为各种的交互(如:跳转到其他应用,下拉StatusBar,弹出键盘)的发送而被系统清除。

3.View.SYSTEM_UI_FLAG_IMMERSIVE:(>=api19)

作用:避免某些用户交互造成系统自动清除全屏状态。

  • 1、View.SYSTEM_UI_FLAG_IMMERSIVE和View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY的使用主要是为了当设置全屏模式时,避免某些用户交互造成系统自动清除全屏状态。
  • 2、当使用View.SYSTEM_UI_FLAG_HIDE_NAVIGATION隐藏导航栏时,配合此特性,只有第三、四种操作会导致导航栏的隐藏状态被系统自动清除;否则,任何交互都会导致导航栏的隐藏状态被系统自动清除。
  • 3、此标识只有配合View.SYSTEM_UI_FLAG_HIDE_NAVIGATION才有作用。

4.View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY:(>=api19)

作用:避免某些用户交互造成系统自动清除全屏状态。同时Activity的部分内容也因此被StatusBar覆盖遮挡。

  • 1、用View.SYSTEM_UI_FLAG_HIDE_NAVIGATION隐藏导航栏,配合使用此Flag,只有用户的第四种操作会导致状态栏或(和)导航栏的隐藏状态被系统自动清除。否则任何交互都会导致相应状态的清除。
  • 2、此Flag只有配合SYSTEM_UI_FLAG_FULLSCREEN和SYSTEM_UI_FLAG_HIDE_NAVIGATION使用时才会起作用。

5.View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION:(>=api16)

作用:在不隐藏导航栏的情况下,将Activity的显示范围扩展到导航栏底部。同时Activity的部分内容也因此被NavigationBar覆盖遮挡。

  • 1、当使用此Flag时,设置fitSystemWindow=true的view,会被系统自动添加大小为NavigationBar高度相同的paddingBottom。
  • 2、当window设置WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION时,此Flag会被系统会自动添加。

6.View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN:(>=api16)

作用:在不隐藏StatusBar的情况下,将view所在window的显示范围扩展到StatusBar下面。同时Activity的部分内容也因此被StatusBar覆盖遮挡。

  • 1、当使用此Flag时,设置fitSystemWindow=true的view,会被系统自动添加大小为statusBar和ActionBar高度之和相同的paddingTop。
  • 2、当window设置WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS时,此Flag会被系统会自动添加。

7.View.SYSTEM_UI_FLAG_LAYOUT_STABLE:

作用: 稳定布局。当StatusBar和NavigationBar动态显示和隐藏时,系统为fitSystemWindow=true的view设置的padding大小都不会变化,所以view的内容的位置也不会发生移动。

  • 1、当使用SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN或SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION),同时view设置fitSystemWindow=true时,系统会为此View自动设置padding。此padding的大小由View.fitSystemWindows(Rect)的Rect提供。一般情况下,当StatusBar和NavigationBar显示时,paddingTop的大小为StatusBar的高度。如果设置了getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY),paddingTop的大小则为StatusBar和ActionBar的高度之和。paddingBottom的大小则为NavigationBar的高度。当StatusBar和NavigationBar被隐藏时,View的padingBottom和paddingTop的大小就变成了0, 因此StatusBar和NavigationBar的显示和隐藏造成的padding变化,进而View内容的位置变化,从而造成位置闪动的视觉效果,影响体验。
    使用SYSTEM_UI_FLAG_LAYOUT_STABLE的作用便是当StatusBar和NavigationBar的显示和隐藏,系统为View设置的padding都不会变化,因此View内容的位置不会变化,此即为稳定布局。
    -. (SYSTEM_UI_FLAG_FULLSCREEN |SYSTEM_UI_FLAG_LAYOUT_STABLE)时,
    会同时隐藏Actionbar和StatusBar,但StatusBar所占空间不会隐藏,只会变成空白。同时View所在window的显示范围也不会伸展到StatusBar所占空间。若是加上SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN,View所在window的显示范围则会伸展到StatusBar所在的空间。
    同样对NavigationBar如此操作,也会是一样的效果。
  • 2、当你设置了SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN时,配合此特性,若此时设置或取消SYSTEM_UI_FLAG_FULLSCREEN,不会因为StatusBar的显示或隐藏不会造成内容view的不稳定。
  • 3、当你设置了SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN和SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION,配合此特性,若此时设置或取消SYSTEM_UI_FLAG_FULLSCREEN和SYSTEM_UI_FLAG_HIDE_NAVIGATION,不会因为StatusBar和导航栏的显示或隐藏不会造成内容view的不稳定。
  • 4、此特性不应该只配合SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION使用
  • 5、使用WindowManager.LayoutParams.FLAG_FULLSCREEN(而不是使用SYSTEM_UI_FLAG_FULLSCREEN)来隐藏StatusBar是一个一直持续隐藏的状态。这时你仍然可以使用SYSTEM_UI_FLAG_FULLSCREEN | SYSTEM_UI_FLAG_LAYOUT_STABLE隐藏Actionbar,并且不会因为ActionBar的显示或隐藏而不稳定。

window.addFlags()的常量参数

1.WindowMananger.FLAG_TRANSLUCENT_STATUS: (>=api16)

  • 1、半透明StatusBar,并且不会因用户交互而被清除。
  • 2、设置了此flag,系统会自动设置View.SYSTEM_UI_FLAG_LAYOUT_STABLE和View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN

2.WindowMananger.FLAG_FULLSCREEN:

  • 1、用于隐藏StatusBar。隐藏效果不会被清除。
  • 2、使用此flag,系统会自动忽略输入法的SOFT_INPUT_ADJUST_RESIZE的特性。

3.WindowMananger.FLAG_TRANSLUCENT_NAVIGATION:

  • 1.半透明NavigationBar,并且不会因用户交互而被清除。
  • 2.设置了此flag,系统会自动设置View.SYSTEM_UI_FLAG_LAYOUT_STABLE和View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
    最低版本支持:Android4.4 (api 19)

4.WindowMananger.FLAG_DRAWS_SYSTEM_BAR_BACKGROUND:

  • 1.用于未StatusBar和NavigationBar设置背景颜色。
  • 2.原理:将StatusBar和NavigationBar设置为透明背景,并且将StatusBar和NavigationBar所在空间设置为Window.getStatusBarColor() 和Window.getNavigationBarColor()方法获得的颜色。
    最低版本支持:Android5.0 (api 21)

WindowInsetsControllerCompat 类

上面的参数常量,大部分都会提示已经过期了,因为在API 30 版本里面出了WindowInsetsControllerCompat 的一个新类。
比如 View.SYSTEM_UI_FLAG_FULLSCREEN 以及 WindowManager.LayoutParams.FLAG_FULLSCREEN 常量点进去都会提示使用:

  • @deprecated Use {@link WindowInsetsController#hide(int)} with {@link Type#statusBars()}

但是以上两个常量的作用并不一样。 View.SYSTEM_UI_FLAG_FULLSCREEN 的隐藏作用在下拉状态栏之后就会取消隐藏。需要搭配 View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY 来位置隐藏的效果。 而查看 View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY 源码又会提示使用:

  • @deprecated Use {@link WindowInsetsController#BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE} instead.

经过验证也得出 WindowInsetsController#hide(int) 方法的隐藏会被下拉状态栏操作取消。需要设置 controller.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE 来维持隐藏的状态。

实现需求和方式

隐藏状态栏(全屏显示)

隐藏状态栏分两种情况,一个是在非刘海屏或挖孔屏,也就是正常的直面屏上。

  • 1、直接隐藏状态栏,且状态栏可下拉出来,下来出来的状态栏是半透明的,但是一会后状态栏还是会自动缩回去。下面三种实现方式同效果。(这种方式在刘海屏中会导致有刘海的状态栏直接置黑,且显示内容是不会上移到状态栏处)
<!--第一种-->
<item name="android:windowFullscreen">true</item>
//第二种
window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
//第三种
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY or View.SYSTEM_UI_FLAG_FULLSCREEN
WindowInsetsControllerCompat(window, window.decorView).let {
     it.hide(WindowInsetsCompat.Type.navigationBars())
     it.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
}

WindowInsetsController方式实现:

		WindowInsetsControllerCompat(window, window.decorView).let {
            it.hide(WindowInsetsCompat.Type.navigationBars())
            it.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
        }

android沉浸式状态栏,android,#UI,android,ui,kotlin

  • 2、适配刘海屏的隐藏状态栏。先看一下用上面的方法在挖孔屏上面的实现效果:

android沉浸式状态栏,android,#UI,android,ui,kotlin
可以看到上面有一条很粗的黑边。因为那是前摄挖孔所在,默认显示内容是不能占用挖孔的地方的。
而google 官方是有针对刘海屏的适配方案的,简单的说就是可以让显示内容上移到刘海状态栏的位置。有三种方式供选择:

 //默认情况,全屏页面不可用刘海区域,非全屏页面可以进行使用
 public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT = 0;

 //不允许使用刘海区域
 public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER = 2;

 //允许页面延伸到刘海区域
 public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES = 1;

使用方式如下:

		if (Build.VERSION.SDK_INT >= 28) {
            val lp = window.attributes
            lp.layoutInDisplayCutoutMode =
                WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
            window.attributes = lp
        }

但是加上这个只是允许window 可以上升到刘海屏的状态栏,还需要加上 View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 来确保view可以上移到状态栏。具体如下

    fun hideStatusBar(window: Window) {
        //直屏手机一行就搞定
        window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)

        //允许window 的内容可以上移到刘海屏状态栏
        if (Build.VERSION.SDK_INT >= 28) {
            val lp = window.attributes
            lp.layoutInDisplayCutoutMode =
                WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
            window.attributes = lp
        }
        //将显示内容上移到状态栏
        window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    }

WindowInsetsController方式实现:

    /**
     * 隐藏状态栏,显示内容上移到状态栏
     */
    fun hideStatusBar3(window: Window) {
        WindowInsetsControllerCompat(window, window.decorView).let {
            //效果同SYSTEM_UI_FLAG_FULLSCREEN
            it.hide(WindowInsetsCompat.Type.statusBars())
            //维持隐藏的效果,hide 方法的隐藏会被下拉状态栏取消的。效果同 View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
            it.systemBarsBehavior =
                WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
        }

        //允许window 的内容可以上移到刘海屏状态栏
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            val lp = window.attributes
            lp.layoutInDisplayCutoutMode =
                WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
            window.attributes = lp

//            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
                //将显示内容上移
//                window.setDecorFitsSystemWindows(false)
//            } else {
                window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
//            }
        }
    }

此处 View.View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 之所以不用 window.setDecorFitsSystemWindows(false) 代替,是因为 window.setDecorFitsSystemWindows(false) 还包含有 View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION的作用。如果替代了,则效果如下:
android沉浸式状态栏,android,#UI,android,ui,kotlin
可以看到底部的两行textview都被遮挡了。也就是页面内容延伸到了导航栏底部。

沉浸式状态栏

沉浸式状态栏就很容易理解了,就是把显示的内容上移到状态栏,但是又不隐藏状态栏。(当然直接修改状态栏的颜色,让它和背景一样也是可以的,但是这种仅仅在纯色的情况下实用,如果是图片类的背景就不适用了)。实现如下:

	/**
     * 沉浸式状态栏
     */
    fun transparentStatusBar(window: Window){
        //去掉半透明的可能性
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
        //可以设置系统栏的背景色
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
        window.statusBarColor = Color.TRANSPARENT
        //view的位置上移到系统栏
        window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
    }

看下效果图:
android沉浸式状态栏,android,#UI,android,ui,kotlin
效果是实现了,但是有点小瑕疵,我们是不希望状态栏遮住我们的内容,但是如果每个页面都要手动计算状态栏的高度然后去设置padding 就过于麻烦了。很简单,在布局文件的根布局加上:

android:fitsSystemWindows="true"

这个属性只有设置了 View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATIONView.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN,才会有效果。
作用呢就是自动给view加上个对应系统栏高度的padding。看下效果:
android沉浸式状态栏,android,#UI,android,ui,kotlin

隐藏导航栏

没啥好说的,直接上代码吧

    /**
     * 隐藏导航栏
     */
    fun hideNavigation(window: Window) {
        //将显示内容下移到导航栏
        window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
    }

WindowInsetsController方式实现:

    /**
     * 隐藏导航栏
     */
    fun hideNavigation2(window: Window) {
        //将显示内容下移到导航栏
        WindowInsetsControllerCompat(window, window.decorView).let {
            //效果同SYSTEM_UI_FLAG_HIDE_NAVIGATION
            it.hide(WindowInsetsCompat.Type.navigationBars())
            //维持隐藏的效果,hide 方法的隐藏会被下拉状态栏取消的。效果同 View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
            it.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
        }
    }

沉浸式导航栏

	/**
     * 沉浸式导航栏,这里就不用WindowInsetsControllerCompat 实现了,因为View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 没办法等效替换
     * fixme :有BUG, View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 不仅仅将内容下移到导航栏,还会上移到状态栏
     */
    fun transparentNavigationBar(window: Window) {
        //去掉半透明的可能性
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
        //可以设置系统栏的背景色
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
        window.navigationBarColor = Color.TRANSPARENT
        //view的位置下移到导航栏
        window.decorView.systemUiVisibility =
            View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
    }

记得要配合 fitsSystemWindows 使用

android沉浸式状态栏,android,#UI,android,ui,kotlin

隐藏状态栏以及导航栏

如果同时使用上面的两个方法组合是不行的。因为 window.decorView.systemUiVisibility 是赋值使用的,后一个会覆盖前一个的。实现如下:

    /**
     * 隐藏两个系统栏
     */
    fun hideSystemBar(window: Window){
        //直屏手机一行就搞定
        window.decorView.systemUiVisibility =
                    // 隐藏系统栏
                    View.SYSTEM_UI_FLAG_FULLSCREEN or
                    // 隐藏导航栏
                    View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or
                    //维持隐藏的效果
                    View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY or
                    //将内容往上推到刘海屏的位置
                    View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN

        //允许window 的内容可以上移到刘海屏状态栏
        if (Build.VERSION.SDK_INT >= 28) {
            val lp = window.attributes
            lp.layoutInDisplayCutoutMode =
                WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
            window.attributes = lp
        }
    }

WindowInsetsController方式实现:

    /**
     * 隐藏两个系统栏
     */
    fun hideSystemBar2(window: Window) {
        WindowInsetsControllerCompat(window, window.decorView).let {
            //效果同SYSTEM_UI_FLAG_FULLSCREEN
            it.hide(WindowInsetsCompat.Type.statusBars())
            it.hide(WindowInsetsCompat.Type.navigationBars())
            //维持隐藏的效果,hide 方法的隐藏会被下拉状态栏取消的。效果同 View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
            it.systemBarsBehavior =
                WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
        }

        //允许window 的内容可以上移到刘海屏状态栏
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            val lp = window.attributes
            lp.layoutInDisplayCutoutMode =
                WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
            window.attributes = lp

            //在不隐藏系统栏的情况下,将内容移动到系统栏
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
                //该方法会同时作用于状态栏以及导航栏
                window.setDecorFitsSystemWindows(false)
            } else {
                window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
            }
        }
    }

android沉浸式状态栏,android,#UI,android,ui,kotlin

沉浸式状态栏以及导航栏

    /**
     * 沉浸式状态栏以及导航栏
     */
    fun transparentSystemBar(window: Window) {
        //去掉半透明的可能性
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
        //可以设置系统栏的背景色
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
        window.statusBarColor = Color.TRANSPARENT
        window.navigationBarColor = Color.TRANSPARENT
        //view的位置上移到系统栏
        window.decorView.systemUiVisibility =
                //将内容上移到状态栏
            View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or
                    //将内容下移到状态栏
                    View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or
                    View.SYSTEM_UI_FLAG_LAYOUT_STABLE
    }

    /**
     * 沉浸式状态栏以及导航栏
     */
    fun transparentSystemBar2(window: Window) {
        //去掉半透明的可能性
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
        //可以设置系统栏的背景色
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
        window.statusBarColor = Color.TRANSPARENT
        window.navigationBarColor = Color.TRANSPARENT

        //在不隐藏系统栏的情况下,将内容移动到系统栏
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            //该方法会同时作用于状态栏以及导航栏
            window.setDecorFitsSystemWindows(false)
        } else {
            window.decorView.systemUiVisibility =
                View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
        }
    }

记得要配合 fitsSystemWindows 使用
android沉浸式状态栏,android,#UI,android,ui,kotlin文章来源地址https://www.toymoban.com/news/detail-823602.html

总结

  • 1、隐藏状态栏时,刘海屏需要多做两个步骤
    ①:将 window 上移到状态栏位置。
    ②:将decorView 上移到状态栏位置。
    而隐藏导航栏时则直接隐藏即可。
  • 2、沉浸式设置都要配合 fitsSystemWindows 使用才不会遮挡显示内容
  • 3、隐藏状态栏的时候,如果加上了 fitsSystemWindows 属性,那么在刘海屏手机上也会有一个上边距,如下图,在直屏手机中是正常的。
    -android沉浸式状态栏,android,#UI,android,ui,kotlin

到了这里,关于【UI篇】Android 沉浸式状态栏的那些事的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • android11 如何修改状态栏的背景

    修改status_bar.xml :

    2024年04月16日
    浏览(35)
  • Android实现ImmersionBar沉浸式状态栏

    1、在build.gradle中加上 2、设置页面为全屏 将上图中的 改为 3、 加入以下代码段 4、完成上面三步,会发现页面布局会上移,解决方法就是在布局文件中加入:

    2024年02月15日
    浏览(41)
  • Android 实现沉浸式状态栏(包含顶部栏吸顶Layout CoordinatorLayout实现沉浸式状态栏)

    Android状态栏默认是固定的黑底白字,这肯定是不被伟大的设计师所喜爱的,更有甚者,某些时候设计希望内容能够延伸到状态栏上部(例如顶部是大图的情况)。所幸的是随着Android版本的迭代,开发者对状态栏等控件有了更多的控制。Android一直在尝试引入新的Api来满足开发

    2024年02月14日
    浏览(38)
  • Android MVI架构之UI状态的持有与保存

    我们将介绍状态持有者和其他与 UI 层相关的主题,例如在 Android 上提升状态和保存 UI 状态的位置。 状态持有者通过处理逻辑和/或公开 UI 状态来简化 UI。在本节中,我们将看到如何实现状态持有者以及需要考虑的实现细节。 为了确定实现细节,我们首先需要确定 Android 应用

    2024年02月04日
    浏览(39)
  • Android隐藏导航栏和状态栏的方法

    一。去除状态栏 以下是Android去除状态栏的代码示例: 1. 在Activity的onCreate()方法中添加以下代码: getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 2. 在AndroidManifest.xml文件中的Activity节点中添加以下属性: android:theme=\\\"@android:style/Theme.NoTitleB

    2024年02月16日
    浏览(41)
  • Android 12 MTK SystemUI 下拉状态栏 UI定制化开发(1)

    1. 概述 距离上次更新有一周时间过去了,忙着工作,没来得及更新博客,各位看官老爷久等了,这次打算写一个UI定制系列,关于MTK  android 12  UI定制吧!   2. 效果图 原生效果图:  定制后效果图: 3.修改路径 4.总结 想要修改这块UI界面,需要梳理出整体流程是怎么过来,

    2024年02月13日
    浏览(41)
  • 史上最完美的Android沉浸式状态导航栏攻略

    最近我在小破站开发一款新App,叫 高能链 。我是一个完美主义者,所以不管对架构还是UI,我都是比较抠细节的,在状态栏和导航栏沉浸式这一块,我还是踩了挺多坑,费了挺多精力的。这次我将我踩坑,适配各机型总结出来的史上最完美的Android沉浸式状态导航栏攻略分享

    2023年04月26日
    浏览(41)
  • Android全屏弹出Dialog显示状态栏和导航栏的问题及解决方案

    在移动端开发中,有时候我们需要在Android应用中弹出一个全屏的Dialog。然而,当我们尝试实现这样的Dialog时,可能会遇到一个问题:状态栏和导航栏在全屏Dialog中仍然可见,这可能会影响用户体验。本文将介绍如何解决这个问题,并提供相应的源代码。 问题描述: 当我们使

    2024年02月05日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包