一、沉溺式状态栏的完成
该办法用于表示内容是否超出至状态栏和底部导航栏显现,false标明超出。(这也就咱们完成沉溺式后需要做适配的原因)
WindowCompat.setDecorFitsSystemWindows(window, false)
注意:当运用setDecorFitsSystemWindows()
时,注意不要运用View.setSystemUiVisibility()
,因为在源码中,对于Android4.1-10的手机依旧采用了setSystemUiVisibility()办法完成沉溺式。
设置状态栏透明
window.statusBarColor = Color.TRANSPARENT
二、沉溺式导航栏的完成
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
//当背景透明时去掉灰色蒙层
window.isNavigationBarContrastEnforced = false
}
//导航栏色彩透明
window.navigationBarColor = Color.TRANSPARENT
三、处理状态栏UI与布局内容发生的堆叠
完成沉溺式后咱们会发现,布局内容与状态栏、底部导航栏叠加在一起了,为了防止运用UI与体系UI发生堆叠,所以咱们要对其进行偏移。
首先经过这个办法,获取insets。参数填入window.decorView,当然也能够运用坐落完成沉溺式的页面的view,
ViewCompat.setOnApplyWindowInsetsListener(view) { view, insets:WindowInsetsCompat -> }
那么insets详细是什么呢?实际上insets是描述一组用于窗口内容的插入。说人话便是:咱们能够从insets中获取包括状态栏,导航栏等体系UI的方位间隔,然后用于调整咱们的运用UI的方位。接下来咱们就来看怎么完成
ViewCompat.setOnApplyWindowInsetsListener(view) { view, insets:WindowInsetsCompat ->
val systemWindow=insets.getInsets(WindowInsetsCompat.Type.systemBars() or
WindowInsetsCompat.Type.displayCutout())
//为需要偏移的view设置padding
moveView.setPadding(0,systemWindow.top,0,0)
insets
}
经过inset.getInsets()
获取对应的体系UI的信息,咱们也能够经过 “or” 同时获取多种体系栏的间隔。例如咱们能够同时获取体系的状态栏和刘海屏高度,假如刘海屏的高度更高则回来的是刘海屏的高度。
因为沉溺式所导致的底部布局与导航栏堆叠问题也一样迎刃而解了。
view.setPadding(0,0,0,systemWindow.bottom)
WindowInsetsCompat.Type
参数解释:
WindowInsetsCompat.Type.ime()
;//键盘
WindowInsetsCompat.Type.displayCutout()
;//刘海屏
WindowInsetsCompat.Type.statusBars()
;//状态栏
WindowInsetsCompat.Type.navigationBars()
;//导航栏
WindowInsetsCompat.Type.captionBar()
;//标题栏
WindowInsetsCompat.Type.systemBars()
;//状态栏,导航栏和标题栏
WindowInsetsCompat.Type.systemGestures()
;//体系手势
WindowInsetsCompat.Type.mandatorySystemGestures()
;//强制性体系手势
WindowInsetsCompat.Type.tappableElement()
;//可点击区域
四、其他常见问题
状态栏字体色彩修正:
//状态栏字体改为白色
WindowCompat.getInsetsController(window,window.decorView).isAppearanceLightStatusBars = false
//状态栏字体改为黑色
WindowCompat.getInsetsController(window,window.decorView).isAppearanceLightStatusBars = true
导航栏按钮色彩修正:
WindowCompat.getInsetsController(window,window.decorView).isAppearanceLightNavigationBars= false
用这个办法的时候会导致状态栏字体变成白色,目前我的解决办法是重新再设置一次状态栏字体色彩,假如你有更好的解决办法欢迎在谈论区留言。