Android狀態欄合集-管你透不透明
溯源
Android的狀態欄千奇百怪。原生的colorPrimary和colorPrimaryDark,Android的沉浸式狀態欄,還有所謂的仿iOS的純透明狀態欄,到底哪個最好看,眾說紛紜。
分類
-
colorPrimary&colorPrimaryDark
用AndroidStudio新建一個項目,瀏覽res文件夾,找到colors.xml,如下:
這里的colorPrimary默認就是ActionBar的顏色,colorPrimaryDark就是狀態欄的顏色,而下面的colorAccent是Android的強調色,比如FAB的控件顏色,EditText選中時方框下面顯示的顏色。
colors.xml具體設置
-
Android沉浸式狀態欄
設置很簡單,兩行代碼搞定(添加到setContentViwe()后面):
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
然后界面變成了這樣:
注意到狀態欄顏色變深了,下面的導航欄也由先前的深色變成了現在的灰白色,字面意思第一句就是設置的狀態欄,第二句設置的導航欄。如果在抽屜菜單設置此效果會是這樣:
類似的有Gmail:
Gmail使用沉浸式狀態欄
-
Android完全的透明狀態欄
上次我寫了一篇文章關于透明狀態欄的,寫得不好,不夠用心,這里給大家說聲抱歉。
這里所說的透明狀態欄是像網易云音樂那樣的透明狀態欄,如圖:
狀態欄透明1
狀態欄透明2
這里我說說我的實現方式。透明狀態欄1:
- 在Activity中設置
getWindow().setStatusBarColor(Color.TRANSPARENT);
- 在XML布局文件里面設置頂布局的background的顏色與Toolbar顏色相同,并設置
android:fitsSystemWindows="true"
屬性,這樣就實現了透明狀態欄。
那么,問題來了……
既然這里的透明就是把狀態欄的顏色換成Toolbar一樣的顏色就行了,為什么不直接把colorPrimary和colorPrimaryDark的顏色弄成一樣的呢?這樣不是更簡單么?
當然程序員都是懶的,都是想花最少的時間干最多的事,所以一切看似冗雜的代碼都是有目的的。
解釋:設置相同的顏色只是解決了Activity沒有抽屜的效果的情況下的窘境,但是如果有像狀態欄透明2那樣的抽屜怎么辦呢?
可以看到狀態欄上的顏色與抽屜菜單上面的顏色不一致,或者叫抽屜菜單的header背景并沒有延伸到狀態欄,給用戶一種不好的體驗。而使用在Activity添加代碼的方式就能很好地解決這個問題。
然后我們立馬把使用這個方法,運行:
What?怎么會這樣,我是這樣設置的啊???
其實一開始我也是那么天真,以為設置了上面的代碼就可以,后來查閱資料才知道還有一句代碼不可缺少:
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
這里涉及到Window和DecorView的知識,不詳細介紹了……看字面意思能理解,然后就設置成功了:
這也就實現了網易云音樂的透明狀態欄。見源碼Main22Activity.
補充
實現圖片作為全屏背景
這個東西本來挺簡單的,但是自己以前在瞎搞,有些只是理解錯了,現在寫下來給自己留個印象,也給大家一個補充。
設置背景圖片全屏不能直接在根布局里面設置background,這樣狀態欄無法隱藏。寫了透明狀態欄,就想到能不能用相同的方法設置呢。于是乎就利用上面的透明狀態欄設置背景圖片。在代碼中
getWindow().setStatusBarColor(Color.TRANSPARENT);
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
在XML根布局里面添加背景資源并設置android:fitsSystemWindows="true"
點擊運行,ok大功告成!
圖片作為整體背景
注意:
- 以上代碼只是實現了需求,時間關系沒有過多關注美觀~
- 要實現圖片作為全屏背景注意不能讓根布局為
android.support.design.widget.CoordinatorLayout
,可能是CoordinatorLayout內部實現的關系,使用LinearLayout即可。
總結
Android的UI比想象中的好玩,但是也挺難的,希望和我一樣熱愛UI的朋友能堅持學習,態度決定一切。文中不免有錯誤的地方,希望廣大讀者提出指正!共勉!