項目地址: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 和各位大俠的帖子
不足
- 4.4的NavigationBar(虛擬鍵)不道怎麼設置背景顏色
- 只能設置狀態欄的圖標顏色(黑色/白色)
- 個人感覺這還是走的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
}
}
}
}