前言
- 關(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+是半透明