使用setSystemUiVisibility適配statusbar和navigationbar

前言

  • 關(guān)于沉浸式標(biāo)準(zhǔn)的定義:App默認(rèn)是全屏的,用戶可以從頂部或者底部“滑出”狀態(tài)欄和導(dǎo)航欄,一段時(shí)間后狀態(tài)欄和導(dǎo)航欄會(huì)自動(dòng)消失。

setSystemUiVisibility
4.0之后,官方提供了這個(gè)方法,可以改變系統(tǒng)的UI可見性,使用方式如下:

int flag = View.SYSTEM_UI_FLAG_FULLSCREEN;
getWindow().getDecorView().setSystemUiVisibility(flag);

多個(gè)值可以使用"|"操作符,比如:

int flag = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
getWindow().getDecorView().setSystemUiVisibility(flag);

常見flag展示效果如下:

  • SYSTEM_UI_FLAG_FULLSCREEN(4.1+):隱藏狀態(tài)欄,手指在屏幕頂部往下拖動(dòng),狀態(tài)欄會(huì)再次出現(xiàn)且不會(huì)消失,另外activity界面會(huì)重新調(diào)整大小,直觀感覺就是activity高度有個(gè)變小的過程。
SYSTEM_UI_FLAG_FULLSCREEN
  • SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN(4.1+):配合SYSTEM_UI_FLAG_FULLSCREEN一起使用,效果使得狀態(tài)欄出現(xiàn)的時(shí)候不會(huì)擠壓activity高度,狀態(tài)欄會(huì)覆蓋在activity之上
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
  • SYSTEM_UI_FLAG_HIDE_NAVIGATION(4.0+):會(huì)使得虛擬導(dǎo)航欄隱藏,但同樣用戶可以從屏幕下邊緣“拖出”且不會(huì)再次消失,同時(shí)activity界面會(huì)被擠壓 。
SYSTEM_UI_FLAG_HIDE_NAVIGATION
  • SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION(4.1+):配合 SYSTEM_UI_FLAG_HIDE_NAVIGATION 一起使用,效果使得導(dǎo)航欄出現(xiàn)的時(shí)候不會(huì)擠壓activity高度,導(dǎo)航欄會(huì)覆蓋在activity之上。
SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
  • 使用以上四個(gè)屬性,可以達(dá)到activity占據(jù)屏幕所有空間,同時(shí)狀態(tài)欄和導(dǎo)航欄可以懸浮在activity之上的效果。但是此時(shí)activity的內(nèi)容也會(huì)(比如頂部和底部各有一個(gè)TextView)狀態(tài)欄和導(dǎo)航欄之下,當(dāng)狀態(tài)欄和導(dǎo)航欄出現(xiàn)的時(shí)候,看起來會(huì)這樣:
四個(gè)屬性

顯然,文字被遮蓋了我們是不能接受的,此時(shí)我們需要另外一個(gè)屬性,android:fitsSystemWindows=“true”,這個(gè)屬性表示系統(tǒng)UI(狀態(tài)欄、導(dǎo)航欄)可見的時(shí)候,會(huì)給我們的布局加上padding(paddingTop、paddingBottom)屬性,這樣內(nèi)容就不會(huì)被蓋住了。我們?cè)赼ctivity的根布局加上這個(gè)屬性,效果如下:

fitsSystemWindows

以上都是4.1(除了SYSTEM_UI_FLAG_HIDE_NAVIGATION)的屬性,觀察之后我們發(fā)現(xiàn),不管是那種屬性,狀態(tài)欄和導(dǎo)航欄總是會(huì)“遮擋”activity,為了解決這個(gè)問題,4.4引入了“全屏沉浸模式”這個(gè)概念。

  • SYSTEM_UI_FLAG_IMMERSIVE(4.4+):這個(gè)屬性是用來實(shí)現(xiàn)“沉浸式”效果的,官方稱作“Immersive full-screen mode”

To provide your app with a layout that fills the entire screen, the new SYSTEM_UI_FLAG_IMMERSIVEflag for setSystemUiVisibility()(when combined with SYSTEM_UI_FLAG_HIDE_NAVIGATION) enables a new immersive full-screen mode.

SYSTEM_UI_FLAG_HIDE_NAVIGATION+SYSTEM_UI_FLAG_IMMERSIVE
  • SYSTEM_UI_FLAG_IMMERSIVE_STICKY :和SYSTEM_UI_FLAG_IMMERSIVE相似,它被稱作“粘性”的沉浸模式,這個(gè)模式會(huì)在狀態(tài)欄和導(dǎo)航欄顯示一段時(shí)間后,自動(dòng)隱藏(你可以點(diǎn)擊一下屏幕,立即隱藏)。同時(shí)需要重點(diǎn)說明的是,這種模式下,狀態(tài)欄和導(dǎo)航欄出現(xiàn)的時(shí)候是“半透明”狀態(tài),效果如下 :
粘性

關(guān)于Translucent Bar

  • 4.4以上實(shí)現(xiàn)方式,大概需要用到以下兩個(gè)屬性:
  • windowTranslucentNavigation:application的主題加上這個(gè)屬性,表示狀態(tài)欄半透明,另外,會(huì)使得狀態(tài)欄會(huì)懸浮在activity之上(此時(shí),activity布局會(huì)擴(kuò)展到狀態(tài)欄底部(Z軸方向)):
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowTranslucentStatus">true</item>
    </style>
    為了不遮擋activity內(nèi)容,需要配合另外一個(gè)屬性
  • android:fitsSystemWindows:使用這個(gè)屬性的View,系統(tǒng)會(huì)在View頂部添加padding(大小為狀態(tài)欄高度):
  • 如果希望頂部是圖片,在z軸方向上和statusbar統(tǒng)一維度,則不用使用fitsSystemWindows 效果如圖:
頂部圖片
  • activity布局會(huì)擴(kuò)展到狀態(tài)欄
    <item name="android:windowTranslucentStatus">true</item>
  • 如果你希望擴(kuò)展的區(qū)域,不被狀態(tài)欄蓋住內(nèi)容,那就加上
    android:fitsSystemWindows="true"
  • 狀態(tài)欄在4.4-5.0之間的效果是全透明,5.0+是半透明
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容