前言
本人所有文章禁止任何形式的轉(zhuǎn)載,謝謝
我們主要做的事小白條的沉浸,而不是安卓口中的沉浸。安卓口中的沉浸主要是對(duì)于閱讀、游戲等場(chǎng)景下隱藏狀態(tài)欄和導(dǎo)航欄。而我們的目標(biāo)僅僅是使導(dǎo)航欄背景透明,并且能夠顯示導(dǎo)航欄下面的內(nèi)容,IOS 那樣的效果。
這在安卓中其實(shí)也是有的,我們可以看看安卓的Settings

效果很不錯(cuò)。其實(shí)也就是說憑借安卓本身就可以做到。差一點(diǎn)就要用自定義view 替換狀態(tài)欄和導(dǎo)航欄了。其實(shí)使用自定義view 也是有好處的,就是不用關(guān)心怎么適配安卓,但是做出真正能用的,想必肯定要花不少時(shí)間,所以還是這種方法更經(jīng)濟(jì)一點(diǎn)。
實(shí)現(xiàn)
- 這是什么處理都沒有的。

-
首先第一步就是讓內(nèi)容可以擴(kuò)展到下面。你很可能了解到的一個(gè)方法就是
<item name="android:windowTranslucentNavigation">true</item>

確實(shí)擴(kuò)展到底部了,但是蒙了一層灰色。且無(wú)法去掉,即使為其設(shè)置透明色。
- 所以上面的方法應(yīng)該棄用??紤]用新的方法設(shè)置“全屏”
window.setDecorFitsSystemWindows(false)

但是這時(shí)候你的Android studio 就開始出現(xiàn)紅色提示,告訴你這段代碼有兼容問題。安卓提供了一系列的兼容庫(kù),一般就是原來(lái)的庫(kù)后面加上Compat。所以
WindowCompat.setDecorFitsSystemWindows(window, false)
完美解決問題。
- 現(xiàn)在考慮如何修改顏色。如果要修改顏色,需要添加
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
然后是真正的修改顏色
window.navigationBarColor = Color.TRANSPARENT

但是底部的小白條變成“不太顯眼”了。如果你有把它變成白色的需求,應(yīng)該是無(wú)法完成的。不管是使用
WindowInsetsControllerCompat(window, window.decorView).isAppearanceLightNavigationBars = true
還是
window.isNavigationBarContrastEnforced = false
都不行。雖然他們java doc看起來(lái)他們應(yīng)該是可以的。不過,如果把整個(gè)頁(yè)面變成黑色,這個(gè)小白條就變成白色了,也就是說小白條的顏色完全由系統(tǒng)處理,沒有給開發(fā)人員多余的操作空間。
- 現(xiàn)在的問題是頂部的內(nèi)容被截了一部分。我們要的只是底部沉浸。通過layout inspector 發(fā)現(xiàn)
內(nèi)容上面頂了一個(gè)actionbar 的高度,actionbar 上面頂了一個(gè)通知欄的高度。挺詭異。只好把a(bǔ)ctionbar 去掉,使用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 來(lái)設(shè)置這個(gè)setOnApplyWindowInsetsListener 都可以,但是decorView 不行。(試過了就知道了)
