Android 对于状态栏和导航栏的操作

设置状态栏背景颜色
window.statusBarColor = Color.WHITE
设置状态栏和导航栏的浅色和深色(默认)状态
......
        //根据背景颜色是否高亮
        setStatusBarBgColor(ColorUtils.calculateLuminance(Color.WHITE)>=0.5)
......
private fun setStatusBarBgColor(isLightColor: Boolean) {
        if (isLightColor){
            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R){
                val insetsController = window.insetsController
                //浅色状态栏
                insetsController?.setSystemBarsAppearance(WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS,WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS)
                //浅色导航栏
                insetsController?.setSystemBarsAppearance(WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS,WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS)
            }else{
                window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
                window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
                // 为了使这个生效,窗口必须请求WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS
                // 不能请求WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
                // 浅色状态栏背景兼容的模式绘制。
                window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
            }
        }else{
            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R){
                val insetsController = window.insetsController
                //清除状态栏设置
                insetsController?.setSystemBarsAppearance(0,WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS)
                //清除导航栏设置
                insetsController?.setSystemBarsAppearance(0,WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS)
            }else{
                //默认状态栏
                window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE
            }
        }
    }
侵入式状态栏
// 通知视窗,我们(应用)会处理任何系统视窗(而不是 decor)
window.setDecorFitsSystemWindows(false)
// 或者您可以使用 AndroidX中的 WindowCompat 
// 兼容api30以下的
// view.systemUiVisibility = 
// 通知系统,视窗希望在极端的情况下该如何布局内容。查看文档来获取更具体的信息。
// View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
// 通知系统,视窗希望在导航栏被隐藏的情况下如何布局内容。
// View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
WindowCompat.setDecorFitsSystemWindows(window, false)
计算键盘高度动态设置窗口 处理视觉冲突 

这里可以获取状态栏和导航栏

navigationBars()用于导航的任何系统栏

statusBars()用于显示状态的任何系统栏

ViewCompat.setOnApplyWindowInsetsListener(
            window.decorView
        ) { v, insets ->
            val imeHeight = insets.getInsets(WindowInsetsCompat.Type.ime()).bottom
            v.setPadding(
                0,
                0,
                0,
                imeHeight + insets.getInsets(WindowInsetsCompat.Type.navigationBars()).bottom
            )
            // 返回边衬区,这样它们才能够继续在视图树中继续传递下去
            insets
        }
隐藏\显示状态栏和导航栏
        /**API 28 以上 状态栏位置上被黑条占领 问题解决 **/
        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) {
            val controller: WindowInsetsController? = window.decorView.windowInsetsController
            //从边缘滑动以显示隐藏栏。 无论导航栏的可见性如何,手势导航都有效。
            //API level 31
            // controller?.systemBarsBehavior =  WindowInsetsController.BEHAVIOR_DEFAULT
            //“粘性沉浸模式”。 从边缘滑动以暂时显示隐藏栏。
            controller?.systemBarsBehavior =  WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
            //WindowInsets.Type.navigationBars() (底部)导航栏
            //WindowInsets.Type.statusBars() (顶部)状态栏
            //WindowInsets.Type.systemBars() (底部和顶部)系统栏
            if(false) controller?.show/*显示*/(WindowInsets.Type.systemBars())
            else controller?.hide/*隐藏*/(WindowInsets.Type.systemBars())
        } else {
            window.decorView.systemUiVisibility = (
                    View.SYSTEM_UI_FLAG_IMMERSIVE
                            // 将内容设置为显示在系统栏下方,以便在系统栏隐藏和显示时内容不会调整大小。
                            or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                            or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                            or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                            //隐藏导航栏和状态栏
                            or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                            or View.SYSTEM_UI_FLAG_FULLSCREEN
                    )
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值