Android狀態欄合集-管你透不透明

PopFielder 8年前發布 | 43K 次閱讀 Android Android開發 移動開發

溯源

Android的狀態欄千奇百怪。原生的colorPrimary和colorPrimaryDark,Android的沉浸式狀態欄,還有所謂的仿iOS的純透明狀態欄,到底哪個最好看,眾說紛紜。

分類

  • colorPrimary&colorPrimaryDark

用AndroidStudio新建一個項目,瀏覽res文件夾,找到colors.xml,如下:

Android狀態欄合集-管你透不透明 - 簡書


這里的colorPrimary默認就是ActionBar的顏色,colorPrimaryDark就是狀態欄的顏色,而下面的colorAccent是Android的強調色,比如FAB的控件顏色,EditText選中時方框下面顯示的顏色。

Android狀態欄合集-管你透不透明 - 簡書

colors.xml具體設置

  • Android沉浸式狀態欄

設置很簡單,兩行代碼搞定(添加到setContentViwe()后面):

getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);

然后界面變成了這樣:

Android狀態欄合集-管你透不透明 - 簡書

注意到狀態欄顏色變深了,下面的導航欄也由先前的深色變成了現在的灰白色,字面意思第一句就是設置的狀態欄,第二句設置的導航欄。如果在抽屜菜單設置此效果會是這樣:

Android狀態欄合集-管你透不透明 - 簡書


類似的有Gmail:

Android狀態欄合集-管你透不透明 - 簡書

Gmail使用沉浸式狀態欄

  • Android完全的透明狀態欄

上次我寫了一篇文章關于透明狀態欄的,寫得不好,不夠用心,這里給大家說聲抱歉。

這里所說的透明狀態欄是像網易云音樂那樣的透明狀態欄,如圖:

Android狀態欄合集-管你透不透明 - 簡書

狀態欄透明1

Android狀態欄合集-管你透不透明 - 簡書

狀態欄透明2

這里我說說我的實現方式。透明狀態欄1

  • 在Activity中設置
    getWindow().setStatusBarColor(Color.TRANSPARENT);
    這樣把狀態欄顏色設置成了透明的(注意這是透明的,沒有顏色哦)。
  • 在XML布局文件里面設置頂布局的background的顏色與Toolbar顏色相同,并設置
    android:fitsSystemWindows="true"屬性,這樣就實現了透明狀態欄。

那么,問題來了……
既然這里的透明就是把狀態欄的顏色換成Toolbar一樣的顏色就行了,為什么不直接把colorPrimary和colorPrimaryDark的顏色弄成一樣的呢?這樣不是更簡單么?
當然程序員都是懶的,都是想花最少的時間干最多的事,所以一切看似冗雜的代碼都是有目的的。

解釋:設置相同的顏色只是解決了Activity沒有抽屜的效果的情況下的窘境,但是如果有像狀態欄透明2那樣的抽屜怎么辦呢?

Android狀態欄合集-管你透不透明 - 簡書


可以看到狀態欄上的顏色與抽屜菜單上面的顏色不一致,或者叫抽屜菜單的header背景并沒有延伸到狀態欄,給用戶一種不好的體驗。而使用在Activity添加代碼的方式就能很好地解決這個問題。
然后我們立馬把使用這個方法,運行:

Android狀態欄合集-管你透不透明 - 簡書

What?怎么會這樣,我是這樣設置的啊???
其實一開始我也是那么天真,以為設置了上面的代碼就可以,后來查閱資料才知道還有一句代碼不可缺少:

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LAYOUT_STABLE);

這里涉及到Window和DecorView的知識,不詳細介紹了……看字面意思能理解,然后就設置成功了:

Android狀態欄合集-管你透不透明 - 簡書


這也就實現了網易云音樂的透明狀態欄。見源碼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狀態欄合集-管你透不透明 - 簡書

圖片作為整體背景

注意:

  • 以上代碼只是實現了需求,時間關系沒有過多關注美觀~
  • 要實現圖片作為全屏背景注意不能讓根布局為 android.support.design.widget.CoordinatorLayout,可能是CoordinatorLayout內部實現的關系,使用LinearLayout即可。

總結

Android的UI比想象中的好玩,但是也挺難的,希望和我一樣熱愛UI的朋友能堅持學習,態度決定一切。文中不免有錯誤的地方,希望廣大讀者提出指正!共勉!


 

閱讀原文

 本文由用戶 PopFielder 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!