前言
本人所有文章禁止任何形式的轉載,謝謝
我們主要做的事小白條的沉浸,而不是安卓口中的沉浸。安卓口中的沉浸主要是對於閱讀、遊戲等場景下隱藏狀態欄和導航欄。而我們的目標僅僅是使導航欄背景透明,並且能夠顯示導航欄下面的內容,IOS 那樣的效果。
這在安卓中其實也是有的,我們可以看看安卓的Settings
效果很不錯。其實也就是說憑藉安卓本身就可以做到。差一點就要用自定義view 替換狀態欄和導航欄了。其實使用自定義view 也是有好處的,就是不用關心怎麼適配安卓,但是做出真正能用的,想必肯定要花不少時間,所以還是這種方法更經濟一點。
實現
- 這是什麼處理都沒有的。
-
首先第一步就是讓內容可以擴展到下面。你很可能瞭解到的一個方法就是
<item name="android:windowTranslucentNavigation">true</item>
確實擴展到底部了,但是蒙了一層灰色。且無法去掉,即使爲其設置透明色。
- 所以上面的方法應該棄用。考慮用新的方法設置“全屏”
window.setDecorFitsSystemWindows(false)
但是這時候你的Android studio 就開始出現紅色提示,告訴你這段代碼有兼容問題。安卓提供了一系列的兼容庫,一般就是原來的庫後面加上Compat。所以
WindowCompat.setDecorFitsSystemWindows(window, false)
完美解決問題。
- 現在考慮如何修改顏色。如果要修改顏色,需要添加
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
然後是真正的修改顏色
window.navigationBarColor = Color.TRANSPARENT
但是底部的小白條變成“不太顯眼”了。如果你有把它變成白色的需求,應該是無法完成的。不管是使用
WindowInsetsControllerCompat(window, window.decorView).isAppearanceLightNavigationBars = true
還是
window.isNavigationBarContrastEnforced = false
都不行。雖然他們java doc看起來他們應該是可以的。不過,如果把整個頁面變成黑色,這個小白條就變成白色了,也就是說小白條的顏色完全由系統處理,沒有給開發人員多餘的操作空間。
- 現在的問題是頂部的內容被截了一部分。我們要的只是底部沉浸。通過layout inspector 發現
內容上面頂了一個actionbar 的高度,actionbar 上面頂了一個通知欄的高度。挺詭異。只好把actionbar 去掉,使用toolbar。
我們可以使用
findViewById<ConstraintLayout>(R.id.contentView).setOnApplyWindowInsetsListener { v, insets ->
val top = WindowInsetsCompat.toWindowInsetsCompat(insets, v).getInsets(WindowInsetsCompat.Type.statusBars()).top
v.updatePadding(top = top)
insets
}
使用什麼view 來設置這個setOnApplyWindowInsetsListener
都可以,但是decorView 不行。(試過了就知道了)