最近項(xiàng)目需求中需要對statusBar做透明穿透處理,剛開始沒想太多潦俺,隨著開發(fā)進(jìn)行,發(fā)現(xiàn)坑位那絕對是滿滿的徐勃,主要就是要對不同的API進(jìn)行適配事示,很難做到多平臺的兼顧。
android的狀態(tài)欄有三種不同狀態(tài)僻肖,分別是:
- 沉浸式狀態(tài)欄
- 透明狀態(tài)欄(又可分為“半透明”和“全透明”)(API>=19)
- 變色狀態(tài)欄(API>=21)
沉浸式狀態(tài)欄指的是肖爵,狀態(tài)欄隱藏,在手指做了相關(guān)操作后檐涝,狀態(tài)欄顯示出來遏匆,例如視頻播放器,在播放視頻時(shí)是隱藏狀態(tài)欄的谁榜,但是點(diǎn)擊屏幕的時(shí)候幅聘,狀態(tài)欄會(huì)顯示出來,再例如文本閱讀器窃植,在閱讀的時(shí)候是全屏的帝蒿,然后從屏幕上方下滑或者下方上劃,虛擬鍵和狀態(tài)欄出現(xiàn)了巷怜,但卻是直接覆蓋在程序文字上的葛超,這是所謂的沉浸式狀態(tài)欄,而我們經(jīng)常把沉浸和透明混為一談,其實(shí)是有本質(zhì)區(qū)別的。
半透明狀態(tài)欄
Android4.4(API 19)以后才開始支持Android:windowTranslucentStatus屬性延塑,需要注意的是,TranslucentStatus屬性雖然是從4.4開始支持的绣张,但在 4.4 和 5.x 上的表現(xiàn)不同,不過都可以概括為一種半透明关带,4.4 是一層漸變的遮罩層,樣子是這樣的:
而5.x 以上是一條半透明的遮罩層,樣子是這樣的:
可以看到Android:windowTranslucentStatus屬性無論在4.4上還是5.0上都做不到全透明侥涵,不過后來發(fā)現(xiàn)有的個(gè)別手機(jī)ROM廠商,不太按套路出牌,比如這個(gè)華為ROM芜飘,在其5.0上通過這個(gè)屬性就可以做到全透明务豺,但是我還是發(fā)現(xiàn)了它支持的并不穩(wěn)定,偶爾還是出現(xiàn)個(gè)半透明條嗦明,所以笼沥,還是按API要求來干事,兩個(gè)字——保險(xiǎn)
全透明狀態(tài)欄
通過上面的分析娶牌,可知通過屬性Android:windowTranslucentStatus并不能做的真正做到狀態(tài)欄的全透明奔浅,想實(shí)現(xiàn)全透明就需要靠另外一個(gè)屬性了——Android:statusBarColor,是的裙戏,這個(gè)同時(shí)也是下面要講的變色狀態(tài)欄要用到的乘凸,所以,往下看~~~
變色狀態(tài)欄
這個(gè)是v21(5.0)以后才開始支持,主要通過Android:statusBarColor進(jìn)行設(shè)置,通過它可以自由設(shè)置狀態(tài)欄顏色累榜,當(dāng)然包括透明色营勤,所以在5.0之后才能實(shí)現(xiàn)statusBar全透明
到此,以上是對statusBar三種樣式的狀態(tài)介紹壹罚,從介紹中不難得出至少兩個(gè)結(jié)論:
第一葛作,對于在5.0以下的系統(tǒng)里如果想實(shí)現(xiàn)statusbar全透明是做不到的。
第二猖凛,就是在5.0以上系統(tǒng)里實(shí)現(xiàn)statusbar全透明有兩種方式赂蠢,一種我稱為 “偽透明” 即假的透明,另一種就是 “真透明” 了辨泳。
偽透明狀態(tài)欄
偽透明指狀態(tài)欄是有背景顏色的虱岂,而并非透明狀態(tài),只不過是通過Android:statusBarColor屬性把statusbarde的顏色設(shè)置的和狀態(tài)欄下面的View的顏色一樣了菠红,這和真透明狀態(tài)欄的主要區(qū)別就是此時(shí)界面中的view顯示是在statusbar下面的第岖,并沒有延伸到statusbar的頂部。
真透明狀態(tài)欄
真透明狀態(tài)欄區(qū)別于上面的偽狀態(tài)欄就不用說了试溯,它通過把Android:statusBarColor屬性設(shè)置為透明蔑滓,而且一個(gè)不能忘記的是需要同時(shí)設(shè)置layout布局延伸到屏幕頂部,否則statusbar透出的背景就是window的根布局的背景顏色了遇绞,也即是DecorView的顏色键袱。設(shè)置布局延伸到頂部的相關(guān)代碼:
Window window = getWindow();
int originStatus = window.getDecorView().getSystemUiVisibility();
int deStatus = originStatus |
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
window.getDecorView().setSystemUiVisibility(deStatus);
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
這個(gè)flag就是控制讓你的布局延伸到屏幕頂部,此時(shí)statusbar會(huì)覆蓋在布局上面摹闽,它和View.SYSTEM_UI_FLAG_FULLSCREEN
很相似蹄咖,可自行查看相關(guān)含義。
看到這付鹿,感覺也就這么多東西澜汤,沒什么難得啊铝量,直接寫不得了,是不是忽略了statusbar上面顯示的內(nèi)容了呢银亲,android中默認(rèn)的statusbar樣式基本是黑色或者灰色背景,然后里面的內(nèi)容是白色纽匙,有的說了既然statusbar的背景顏色可以設(shè)置了务蝠,內(nèi)容不也有個(gè)屬性android:windowLightStatusBar
可以控制顏色呢,確實(shí)烛缔,可以通過這個(gè)屬性來改變statusbar上內(nèi)容的顏色馏段,但是這個(gè)api是android6.0以后才有的,這就尷尬了践瓷,statusbar的顏色在5.0以上的系統(tǒng)都可以改變院喜,但是它上面內(nèi)容的顏色只有在6.0以上的系統(tǒng)才能控制,那么在5.0和6.0之間的系統(tǒng)晕翠,就會(huì)很容易發(fā)生下面這種場景:
- statusbar的顏色需要設(shè)置成白色或者說statusbar穿透的背景是白色了喷舀,而statusbar上的內(nèi)容默認(rèn)也是白色
此時(shí)對于在5.0和6.0之間的系統(tǒng)遇到以上這種情況不就悲催了,而且你是無法去完美適配的淋肾,除非你的app不講究一致性和協(xié)調(diào)美硫麻,因?yàn)間oogle沒給你方法,唉樊卓。