做者 / Chris Banes, Android 開發者關係團隊工程師html
本文是手勢導航連載的第一篇文章,在接下來的時間裏,咱們將會爲你們帶來一系列手勢導航的話題,敬請關注!android
咱們在 Android 10 中添加了新的系統導航模式,用戶能夠經過手勢交互執行後退、返回至主屏以及打開設備助手等操做。bash
在大多數設備上,用戶都能選擇他們喜歡的導航模式。現有的三鍵導航模式 (包含後退、返回首頁以及切換最近使用的應用) 會被保留。搭載 Android 10 及以上版本系統的全部設備都要求保留這一導航模式。微信
您能夠經過 Android 系統 UI 產品經理的文章《Android 10 手勢導航背後的故事》瞭解手勢導航的研究和決策過程。ide
這篇文章是本次連載的第一篇。本系列文章會着重爲開發者們介紹如何讓應用支持手勢導航,涵蓋的主題以下:佈局
如今就讓咱們開啓 "邊到邊" 的全面屏體驗之旅。性能
我使用 "邊到邊" (edge-to-edge) 一詞來描述那種將內容鋪滿整個屏幕,以實現更沉浸視覺體驗的應用。默認狀況下,應用內容的繪製範圍從頂部狀態欄下方開始,延伸至底部導航欄上方。(狀態欄和導航欄統稱爲系統欄)測試
具體來講,這意味着應用須要作兩件事:ui
在導航欄後面繪製內容google
想要支持手勢導航,應用須要考慮的第一個因素是在導航欄後面繪製內容。因爲導航欄自身的大小和突出程度已經相比之前縮小了,所以咱們如今強烈建議,當應用在 Android 10 及以上設備中運行時,將內容拓展至導航欄後方,以提供更具吸引力的現代化 UX。
在搭載 Android 9 及如下的設備上運行時,導航欄後繪製內容是可選的,方便應用根據狀況酌情選擇。作到這些事情所需的 API 也都向前兼容至 API 21 (或 AndroidX 的對應版本),所以支持 Android 10 如下設備所需的額外工做量很小。使用 Android 10 如下設備的用戶一樣能得到更加沉浸的體驗。咱們將它設置爲可選,僅僅是爲了最大程度地減小開發者的工做量和測試量。
在狀態欄後面繪製內容
接下來,咱們來看看屏幕頂部的狀態欄。只要您的內容和佈局容許,咱們建議儘可能把內容也拓展到狀態欄的後方。舉個具體的例子,好比像下圖那樣把一張背景圖鋪在狀態欄後面,具體的技術實現能夠參考相似 AppBarLayout 等佈局,並將其放在屏幕頂部。
想實現 "邊到邊" 全面屏體驗分三步:
1. 請求進行全屏佈局
第一步是讓系統將咱們應用佈局擴展至系統欄後方。須要使用的 API 是視圖上的 setSystemUiVisibility(),它接受一些值,這裏咱們主要關注這麼幾個值:
view.systemUiVisibility =
// Tells the system that the window wishes the content to
// be laid out at the most extreme scenario. See the docs for
// more information on the specifics
View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
// Tells the system that the window wishes the content to
// be laid out as if the navigation bar was hidden
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
複製代碼
設置完畢後能夠看到應用的內容出如今導航欄的後面:
咱們的應用佈局如今已經拓展至全屏範圍,所以須要同步更改一下系統欄的顏色,以便看清其後面的應用內容。
Android 10
在 Android 10 上,咱們只須要將系統欄顏色設爲徹底透明便可:
<!-- values-v29/themes.xml -->
<style name="Theme.MyApp">
<item name="android:navigationBarColor">
@android:color/transparent
</item>
<!-- Optional, if drawing behind the status bar too -->
<item name="android:statusBarColor">
@android:color/transparent
</item>
</style>
複製代碼
在 Android 10 上,系統會負責在全部導航模式下確保系統欄的內容可見 (包括時間、圖標、拖拽條等)。這意味着這些事情再也不須要咱們操心。具體來講,系統會執行如下兩項操做之一:
系統欄裏的內容會根據其後面的內容改變顏色。若是拖拽條位於淺色內容前方,它將變爲深色,在深色內容前方時則變爲淺色。
另外,系統也能夠在系統欄後面放置一層半透明遮蓋。對此咱們最想提醒您注意的是,僅當您的應用聲明 targetSdkVersion 爲 29 時,纔會發生這種狀況。若是您的應用針對的是 SDK 28 或更低版本,則系統不會顯示遮蓋,而是提供透明的導航欄。
不然,系統將使用動態色彩適應。上文中列出的條件是目前系統用來判斷的依據,在未來可能會更改。
在 Android 10 上禁用系統欄視覺保護
若是您不想讓系統執行任何自動內容視覺保護,則能夠經過在主題中將 android:enforceNavigationBarContrast 和/或 android:enforceStatusBarContrast 的值設置爲 false。
Android 9 及更早版本
若是您決定在 Android 10 如下的設備上實現全面屏應用,則應將系統欄顏色設置爲半透明,從而確保其內容可見。好比針對深色主題的系統欄,能夠先試試使用 70% 不透明度的黑色進行遮蓋:
<!-- values/themes.xml -->
<style name="Theme.MyApp">
<item name="android:navigationBarColor">
#B3FFFFFF
</item>
</style>
<!-- values-night/themes.xml -->
<style name="Theme.MyApp">
<item name="android:navigationBarColor">
#B3000000
</item>
</style>
複製代碼
您可能須要根據系統欄後面顯示的內容來調整遮蓋的不透明度。對於淺色主題,能夠試試使用半透明淺色遮蓋 (如 #B3FFFFFF)。
按照本文的說明將應用設置爲全面屏後,您可能會發現應用裏有一些視圖/控件被系統欄遮住了。接下來咱們就須要處理視覺衝突,請關注咱們的微信公衆帳號,接下來將爲您推送本系列更多的文章。
本文鳴謝: Nick Butcher
點擊這裏進一步瞭解 Android 手勢導航