[Android] 小白條(導航欄)沉浸 前言 實現

前言

本人所有文章禁止任何形式的轉載,謝謝

我們主要做的事小白條的沉浸,而不是安卓口中的沉浸。安卓口中的沉浸主要是對於閱讀、遊戲等場景下隱藏狀態欄和導航欄。而我們的目標僅僅是使導航欄背景透明,並且能夠顯示導航欄下面的內容,IOS 那樣的效果。

這在安卓中其實也是有的,我們可以看看安卓的Settings

效果很不錯。其實也就是說憑藉安卓本身就可以做到。差一點就要用自定義view 替換狀態欄和導航欄了。其實使用自定義view 也是有好處的,就是不用關心怎麼適配安卓,但是做出真正能用的,想必肯定要花不少時間,所以還是這種方法更經濟一點。

實現

  1. 這是什麼處理都沒有的。
  1. 首先第一步就是讓內容可以擴展到下面。你很可能瞭解到的一個方法就是

      <item name="android:windowTranslucentNavigation">true</item>
    

確實擴展到底部了,但是蒙了一層灰色。且無法去掉,即使爲其設置透明色。

  1. 所以上面的方法應該棄用。考慮用新的方法設置“全屏”
window.setDecorFitsSystemWindows(false)

但是這時候你的Android studio 就開始出現紅色提示,告訴你這段代碼有兼容問題。安卓提供了一系列的兼容庫,一般就是原來的庫後面加上Compat。所以

WindowCompat.setDecorFitsSystemWindows(window, false)

完美解決問題。

  1. 現在考慮如何修改顏色。如果要修改顏色,需要添加
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)

然後是真正的修改顏色

window.navigationBarColor = Color.TRANSPARENT

但是底部的小白條變成“不太顯眼”了。如果你有把它變成白色的需求,應該是無法完成的。不管是使用

WindowInsetsControllerCompat(window, window.decorView).isAppearanceLightNavigationBars = true

還是

window.isNavigationBarContrastEnforced = false

都不行。雖然他們java doc看起來他們應該是可以的。不過,如果把整個頁面變成黑色,這個小白條就變成白色了,也就是說小白條的顏色完全由系統處理,沒有給開發人員多餘的操作空間。

  1. 現在的問題是頂部的內容被截了一部分。我們要的只是底部沉浸。通過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 不行。(試過了就知道了)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章