window.statusBarColor = Color.WHITE
- ......
- //根据背景颜色是否高亮
- setStatusBarBgColor(ColorUtils.calculateLuminance(Color.WHITE)>=0.5)
- ......
- private fun setStatusBarBgColor(isLightColor: Boolean) {
- if (isLightColor){
- if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R){
- val insetsController = window.insetsController
- //浅色状态栏
- insetsController?.setSystemBarsAppearance(WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS,WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS)
- //浅色导航栏
- insetsController?.setSystemBarsAppearance(WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS,WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS)
- }else{
- window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
- window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
- // 为了使这个生效,窗口必须请求WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS
- // 不能请求WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
- // 浅色状态栏背景兼容的模式绘制。
- window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
- }
- }else{
- if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R){
- val insetsController = window.insetsController
- //清除状态栏设置
- insetsController?.setSystemBarsAppearance(0,WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS)
- //清除导航栏设置
- insetsController?.setSystemBarsAppearance(0,WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS)
- }else{
- //默认状态栏
- window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE
- }
- }
- }
- // 通知视窗,我们(应用)会处理任何系统视窗(而不是 decor)
- window.setDecorFitsSystemWindows(false)
- // 或者您可以使用 AndroidX中的 WindowCompat
- // 兼容api30以下的
- // view.systemUiVisibility =
- // 通知系统,视窗希望在极端的情况下该如何布局内容。查看文档来获取更具体的信息。
- // View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
- // 通知系统,视窗希望在导航栏被隐藏的情况下如何布局内容。
- // View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
- WindowCompat.setDecorFitsSystemWindows(window, false)
这里可以获取状态栏和导航栏
navigationBars()用于导航的任何系统栏
statusBars()用于显示状态的任何系统栏
- ViewCompat.setOnApplyWindowInsetsListener(
- window.decorView
- ) { v, insets ->
- val imeHeight = insets.getInsets(WindowInsetsCompat.Type.ime()).bottom
- v.setPadding(
- 0,
- 0,
- 0,
- imeHeight + insets.getInsets(WindowInsetsCompat.Type.navigationBars()).bottom
- )
- // 返回边衬区,这样它们才能够继续在视图树中继续传递下去
- insets
- }
- /**API 28 以上 状态栏位置上被黑条占领 问题解决 **/
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
- val lp = window.attributes
- lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
- window.attributes = lp
- }
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
- val controller: WindowInsetsController? = window.decorView.windowInsetsController
- //从边缘滑动以显示隐藏栏。 无论导航栏的可见性如何,手势导航都有效。
- //API level 31
- // controller?.systemBarsBehavior = WindowInsetsController.BEHAVIOR_DEFAULT
- //“粘性沉浸模式”。 从边缘滑动以暂时显示隐藏栏。
- controller?.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
- //WindowInsets.Type.navigationBars() (底部)导航栏
- //WindowInsets.Type.statusBars() (顶部)状态栏
- //WindowInsets.Type.systemBars() (底部和顶部)系统栏
- if(false) controller?.show/*显示*/(WindowInsets.Type.systemBars())
- else controller?.hide/*隐藏*/(WindowInsets.Type.systemBars())
- } else {
- window.decorView.systemUiVisibility = (
- View.SYSTEM_UI_FLAG_IMMERSIVE
- // 将内容设置为显示在系统栏下方,以便在系统栏隐藏和显示时内容不会调整大小。
- or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
- or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
- or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
- //隐藏导航栏和状态栏
- or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
- or View.SYSTEM_UI_FLAG_FULLSCREEN
- )
- }