您的位置:首页 > 移动开发 > Android开发

Android浸入式轮子

2017-12-30 21:13 253 查看
项目地址: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
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息