设置Android沉浸式状态栏颜色以及更改字体颜色 AndroidStatusBar

由于公司状态栏一直是黑色的远古时代的状态栏,所以看起来很难受,刚入职就想着修改了这个状态栏先 。体验过“沉浸式”状态栏都会感觉跟黑状态栏完全是两个APP,两种体验。所以现在着手进行状态栏的修改。(小米 魅族等有自己的修改状态了方法 百度搜有很多)

1. 谷歌官方更改状态栏方法

首先改变状态栏颜色需要在4.4之上的系统才能更改,其次,状态栏字体需要6.0之上系统才能更改。

如果你想要更改的是状态栏是花花绿绿的颜色就不需要考虑状态栏字体颜色了,但是大部分手机是白色状态栏字体。如果你的theme颜色也是偏白,那状态栏完全看不到了。所以需要改变状态栏字体颜色。

6.0之后状态栏字体颜色可以改为深色模式或者白色模式。

 状态栏字体为白色:(kotlin写法  Java类似)
    window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE)
 状态栏字体为黑色:
    window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR)
 在此送上完整代码:
class StatusBarUtil {
    companion object {

        fun setStatusBarColor(activity: Activity, colorId: Int, dark: Boolean) {

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                val window = activity.window
                window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
                if (dark) {
                    window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE)
                } else {
                    window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR)
                }
                window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
                window.statusBarColor = Color.TRANSPARENT
//              设置padding以及占位符会出现键盘顶不上去输入框问题 所以直接采用5.0之后的Google方法
                activity.window.statusBarColor = activity.getColor(colorId)
            }
        }
}}

2. 通过layout设置

有时候第一种方法会有一个问题,就是如果我的界面有动画效果,那状态栏会显得很突兀,那有什么办法解决吗?当然有,将整个布局全屏了 状态栏也是在布局里设置过的,那状态栏属于布局一部分,动画也就会一起启动关闭了,这样才显得不会特别突兀。

实现步骤是这样:

1.  layout中最上方设置一个布局

 

先设置为0是因为项目里有6.0以下的手机,但是为了保证显示效果,6.0以下不进行沉浸式,所以高度设置为0

2.设置全屏

//次改状态栏字体颜色以及全屏
        fun setStatusBarByView(activity: Activity,  dark: Boolean) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                val window = activity.window
                window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
                if (dark) {
                    window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                } else {
                    window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                }
                window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
                window.statusBarColor = Color.TRANSPARENT
            }
        }

这个方法是设置全屏以及更改状态栏字体的颜色

3. 设置statusbar的背景颜色

   //修改状态栏高度背景颜色
        fun setStatusBarByViewColor(activity: Activity, statusBar: View, colorId: Int) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                var layoutParams = statusBar.layoutParams
                layoutParams.height=activity.getStatusBarHeight()
                statusBar.layoutParams=layoutParams
                statusBar.setBackgroundColor( activity.getColor(colorId))
            }
        }

  这是把tatusbar布局文件中的view传递过来,然后手动设置高度,然后进行赋颜色

整篇代码都在这里了,之后附上全部代码 ,有问题可以评论大家讨论一下哦

class StatusBarUtil {
    companion object {

        fun setStatusBarColor(activity: Activity, colorId: Int, dark: Boolean) {

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                val window = activity.window
                window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
                if (dark) {
                    window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE)
                } else {
                    window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR)
                }
                window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
                window.statusBarColor = Color.TRANSPARENT
//              设置padding以及占位符会出现键盘顶不上去输入框问题 所以直接采用5.0之后的Google方法
                activity.window.statusBarColor = activity.getColor(colorId)
            }
        }

        fun setImageStatusBar(activity: Activity) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                val window = activity.window
                window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
                window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
                window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
                window.statusBarColor = Color.TRANSPARENT
            }
        }
        //次改状态栏字体颜色以及全屏
        fun setStatusBarByView(activity: Activity,  dark: Boolean) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                val window = activity.window
                window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
                if (dark) {
                    window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                } else {
                    window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                }
                window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
                window.statusBarColor = Color.TRANSPARENT
            }
        }
        //修改状态栏高度背景颜色
        fun setStatusBarByViewColor(activity: Activity,  statusBar : View,colorId: Int) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                var layoutParams = statusBar.layoutParams
                layoutParams.height=activity.getStatusBarHeight()
                statusBar.layoutParams=layoutParams
                statusBar.setBackgroundColor( activity.getColor(colorId))
            }
        }

       
    }
}

 

 

你可能感兴趣的:(Android,Kotlin,kotlin,状态栏,statusbar,沉浸式,Android)