android:fitsSystemWindows
設(shè)置android:fitsSystemWindows生效的前提是控件對于屬性有相應(yīng)的處理烤镐,如果沒有處理則不會生效鼎天。
CoordinatorLayout:處理了沉浸式狀態(tài)欄并且預(yù)留了狀態(tài)欄高度
CollapsingToolbarLayout:結(jié)合CoordinatorLayout可以實現(xiàn)內(nèi)部控件填充到狀態(tài)欄
未處理android:fitsSystemWindows屬性的控件需要自行處理
處理可交換控件被狀態(tài)欄遮擋(預(yù)留空間)
val button = findViewById<Button>(R.id.button)
ViewCompat.setOnApplyWindowInsetsListener(button) { view, insets ->
val params = view.layoutParams as FrameLayout.LayoutParams
params.topMargin = insets.systemWindowInsetTop
insets
}
淺色狀態(tài)欄(字體黑色):
val flags = window.decorView.systemUiVisibility
window.decorView.systemUiVisibility = flags or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
恢復(fù)深色狀態(tài)欄(字體白色):
發(fā)了flags = window.decorView.systemUiVisibility or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
window.decorView.systemUiVisibility = flags xor View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
利用Palette庫動態(tài)獲取圖像顏色設(shè)置狀態(tài)欄字體顏色:
implementation 'androidx.palette:palette:1.0.0'
Palette
.from(bitmap)//接收圖片bitmap
.setRegion(left, top, right, bottom)//指定提取色值區(qū)域
.maximumColorCount(colorCount)//設(shè)置要提取的色值特征點數(shù)
.generate {//獲取異步解析結(jié)果
it?.let { palette ->
var mostPopularSwatch: Palette.Swatch? = null
for (swatch in palette.swatches) {//循環(huán)判斷獲取權(quán)重最高色值
if (mostPopularSwatch == null
|| swatch.population > mostPopularSwatch.population) {
mostPopularSwatch = swatch
}
}
mostPopularSwatch?.let { swatch ->
val luminance = ColorUtils.calculateLuminance(swatch.rgb)
// 當luminance小于0.5時悄雅,認為這是一個深色值.
if (luminance < 0.5) {
setDarkStatusBar()
} else {
setLightStatusBar()
}
}
Android11之后設(shè)置:
使用WindowInsetsController需要core版本提高到1.5.0以上
API詳細說明(需要vpn查看)
https://developer.android.com/reference/android/view/WindowInsetsController?hl=en
控制狀態(tài)欄:
implementation 'androidx.core:core:1.5.0-alpha05'
//初始化WindowInsetsController
val controller = ViewCompat.getWindowInsetsController(view)
//顯示狀態(tài)欄
controller?.show(WindowInsetsCompat.Type.statusBars())
//隱藏狀態(tài)欄
controller?.hide(WindowInsetsCompat.Type.statusBars())
//設(shè)置狀態(tài)欄文字黑色
controller?.isAppearanceLightStatusBars = true
//設(shè)置狀態(tài)欄文字白色
controller?.isAppearanceLightStatusBars = false
控制導(dǎo)航欄:
//顯示
controller?.show(WindowInsetsCompat.Type.navigationBars())
//隱藏
controller?.hide(WindowInsetsCompat.Type.navigationBars())
//導(dǎo)航欄隱藏時手勢操作
controller?.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
//systemBarsBehavior有三個值:
BEHAVIOR_SHOW_BARS_BY_SWIPE
BEHAVIOR_SHOW_BARS_BY_TOUCH
BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
目前可能跟部分手機手勢有沖突
控件鍵盤:
需要界面有EditText并且EditText獲取到焦點才能起作用
//顯示鍵盤
controller?.show(WindowInsetsCompat.Type.ime())
//隱藏鍵盤
controller?.hide(WindowInsetsCompat.Type.ime())
操作所有系統(tǒng)欄:
//全屏顯示:
controller?.hide(WindowInsetsCompat.Type.systemBars())
//顯示其他系統(tǒng)欄:
controller?.show(WindowInsetsCompat.Type.systemBars())