許多app為求美觀,會需要設定全螢幕,也就是自定義頂部狀態欄與底部導航欄,或將其隱藏進入沉浸模式。
先定義中英文對照:
頂部狀態欄 = statusBar
底部導航欄 = navigationBar
//在可執行的地方(例如onCreate)中直接呼叫即可
//在fragment呼叫時需寫成activity.window
window.decorView.systemUiVisibility =
View.SYSTEM_UI_FLAG_VISIBLE or
//隱藏statusBar,點擊螢幕任意區域不會出現,需要從statusBar位置下拉才会出现
View.SYSTEM_UI_FLAG_FULLSCREEN
//將布局內容拓展並放到statusBar後面
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or
//隐藏navigationBar,點擊螢幕任意區域,navigationBar將會重新出現,且不會自動消失。
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or
//將布局内容拓展到navigationBar後面。
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or
//進入沉浸模式,
View.SYSTEM_UI_FLAG_IMMERSIVE or
//進入沉浸模式,且navigationBar會變成半透明,且你上拉navigationBar後,它會自動消失回到沉浸模式。
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
//保持布局與statusBar穩定
View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
fun setStatusBar(activity:Activity,@ColorInt color: Int) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//表示要渲染SYSTEM BAR
activity.window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
//取消半透明設置
activity.window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
//設定狀態欄顏色
activity.window.setStatusBarColor(color)
if (isLightColor(color)) {
// 如果亮色,設定狀態欄文字為黑色
activity.window.getDecorView()
.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR)
}
else {
activity.window.getDecorView()
.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE)
}
}
}
fun isLightColor(@ColorInt color: Int): Boolean {
return ColorUtils.calculateLuminance(color) >= 0.5
}
Android setSystemUiVisibility详解