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
            }
        }
    }
}




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