Android浸入式轮子
2017-12-30 21:13
253 查看
项目地址:BarLibrary
偷个懒 直接把README.md的内容拿来。
使用kotlin造的一个小小的轮子。 一边学习Kotlin一边利刚学的kotlin造个一个小小的轮子,该轮子就是设置StatusBar和NavigationBar的背景颜色/透明和图标颜色,没错就是所谓的浸入式。
StatusBarUtil 和各位大侠的帖子
4.4的NavigationBar(虚拟键)不道怎么设置背景颜色
只能设置状态栏的图标颜色(黑色/白色)
个人感觉这还是走的java的思想,用kotlin的写的。用kotlin的思想会是什么样子的呢?
最后直接把代码粘上吧,也就一百多行
偷个懒 直接把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 } } } }
相关文章推荐
- android 工具轮子
- Android 疯狂造轮子 常用工具类 直接拿来用!
- Android 多线程文件断点下载器实现(造轮子系列)(一)
- Android开源项目和轮子
- Android 多线程文件断点下载器实现(造轮子系列)(二)
- 自己造轮子--Android一个锯齿背景优惠券效果库-CouponView
- Android的那些轮子
- Android各种轮子
- Android轮子
- Android拆轮子系列之写验证码控件的方法
- 【android】第一个简单的轮子(多图展示控件--ImageViewGroup)
- 【Android】识时务者为俊杰,轮子造还是不造
- 自己造轮子 - Android ViewPager轮播实现
- 【轮子介绍】android图片加载库:Glide的简单介绍
- android拆轮子系列之一步一步教你写微信抢红包插件
- Android颜色偏移计算“轮子”-ColorShades
- 轮子系列:一款能用易用好用的Android图片轮播轮子
- Android 中常用的轮子
- Android 浸入式标题栏
- 自己造轮子--android常用多条件筛选菜单实现思路(类似美团,爱奇艺电影票下拉菜单)