Android浸入式轮子

项目地址:BarLibrary

偷个懒 直接把README.md的内容拿来。

使用kotlin造的一个小小的轮子。 一边学习Kotlin一边利刚学的kotlin造个一个小小的轮子,该轮子就是设置StatusBar和NavigationBar的背景颜色/透明和图标颜色,没错就是所谓的浸入式。

怎么使用?

 override fun onCreate(savedInstanceState: Bundle?) {
     super.onCreate(savedInstanceState)
     setContentView(R.layout.activity_main)
       //设置状态栏和虚拟键背景透明,若设置成其他颜色就根据需要给
       //statusBarColor/navigationBarColor/statusIconColor传值就可以了
       BarUtil.setStatusAndNavigationBar(this)
     //BarUtil.setStatusAndNavigationBar(this,statusBarColor = Color.argb(100,10,10,255),statusIconColor = false)
 }

感谢 

StatusBarUtil 和各位大侠的帖子

不足

  1. 4.4的NavigationBar(虚拟键)不道怎么设置背景颜色
  2. 只能设置状态栏的图标颜色(黑色/白色)
  3. 个人感觉这还是走的java的思想,用kotlin的写的。用kotlin的思想会是什么样子的呢?

请各位大侠不吝赐教


最后直接把代码粘上吧,也就一百多行
object BarUtil {

    /**
     * 设置状态栏和虚拟按键的背景色或透明,状态栏图标颜色(黑/白)
     * @param statusBarColor 状态栏背景颜色
     * @param navigationBarColor 虚拟按键背景颜色
     * @param statusIconColor  true 状态栏图标为黑色 false 状态栏图标为白色
     */
    fun setStatusAndNavigationBar(activity: Activity, statusBarColor:Int = Color.TRANSPARENT,
                                  navigationBarColor:Int = Color.TRANSPARENT,
                                  statusIconColor:Boolean? = null){
        if(Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT){
            return
        }else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
            setBarShare(activity)
            activity.window.statusBarColor = statusBarColor
            activity.window.navigationBarColor = navigationBarColor
            setRootView(activity)
        }else{
            var isSetRootView = false
            if(statusBarColor === Color.TRANSPARENT){
                activity.window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
                isSetRootView = true
            }else{
                setStatusBarColor(activity,statusBarColor)
                isSetRootView = true
            }
            if(navigationBarColor === Color.TRANSPARENT){
                activity.window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION)
                isSetRootView = true
            }else{
                //怎么做 不知道
            }
            if (isSetRootView) setRootView(activity)
        }
        if(statusIconColor != null) {
            setDarkStatusIcon(activity, statusIconColor)
        }
    }

    private fun setBarShare(activity: Activity){
        activity.window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
        activity.window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)

        val oldSystemUiFlags = activity.window.decorView.systemUiVisibility
        var newSystemUiFlags = oldSystemUiFlags or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or
                View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
        if (newSystemUiFlags != oldSystemUiFlags) {
            activity.window.decorView.systemUiVisibility = newSystemUiFlags
        }
    }

    private fun setStatusBarColor(activity: Activity, statusBarColor:Int){
        activity.window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
        val decorView = activity.window.decorView as ViewGroup
        val fsbView = decorView.findViewById<View>(R.id.fake_status_bar_view_id)
        if (fsbView != null) {
            if (fsbView.visibility == View.GONE) {
                fsbView.visibility = View.VISIBLE
            }
            fsbView.setBackgroundColor(statusBarColor)
        } else {
            // 绘制一个和状态栏一样高的矩形
            val statusBarView = View(activity)
            val params = LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity))
            statusBarView.layoutParams = params
            statusBarView.setBackgroundColor(statusBarColor)
            statusBarView.id = R.id.fake_status_bar_view_id
            decorView.addView(statusBarView)
        }
    }

    private fun getStatusBarHeight(context: Context):Int{
        // 获得状态栏高度
        val resourceId = context.resources.getIdentifier("status_bar_height", "dimen", "android")
        return context.resources.getDimensionPixelSize(resourceId)
    }

    private fun setRootView(activity: Activity){
        val viewGroup = activity.findViewById<ViewGroup>(android.R.id.content)
        val childCount = viewGroup.childCount
        for(i in 0..childCount){
            val childView = viewGroup.getChildAt(i)
            if(childView is ViewGroup){
                childView.fitsSystemWindows = true
                childView.clipToPadding = true
            }
        }
    }

    /**
     * 设置状态栏图标为黑色或者白色
     * @param bDark true 状态栏图标为黑色 false 状态栏图标为白色
     */
    private fun setDarkStatusIcon(activity: Activity, bDark: Boolean) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            activity.window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
            activity.window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
            val decorView = activity.window.decorView
            if (decorView != null) {
                var systemUiFlags = decorView.systemUiVisibility
                if (bDark) {
                    systemUiFlags = systemUiFlags or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
                } else {
                    systemUiFlags = systemUiFlags and View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv()
                }
                decorView.systemUiVisibility = systemUiFlags
            }
        }
    }
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章