聲明
這篇文章是針對Android 5.0及以上版本的系統進行透明的狀態欄設置,Android 5.0以下的系統暫不在本篇文章的討論范圍之內。
Android 5.0透明狀態欄——普通界面
先貼出MainActivity布局代碼:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorPrimary"
android:fitsSystemWindows="true"
tools:context="stephen.com.material_design.NoteActivity">
<include
layout="@layout/app_bar_note"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
上面的代碼中,最主要的兩行分別是:
- 設置最外層布局背景色為Toolbar的顏色:
android:background="@color/colorPrimary"
- 設置Toolbar不擴展到狀態欄:
android:fitsSystemWindows="true"
在布局文件中設置完畢后,還需要在onCreate()
里面加上如下的代碼: - 設置狀態欄顏色為透明:
getWindow().setStatusBarColor(Color.TRANSPARENT);
- 設置狀態欄和APP的位置關系:
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
setSystemUiVisibility(int visibility)傳入的實參類型如下:
- View.SYSTEM_UI_FLAG_VISIBLE:顯示狀態欄,Activity不全屏顯示(恢復到有狀態的正常情況)。
- View.INVISIBLE:隱藏狀態欄,同時Activity會伸展全屏顯示。
- View.SYSTEM_UI_FLAG_FULLSCREEN:Activity全屏顯示,且狀態欄被隱藏覆蓋掉。
- View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN:Activity全屏顯示,但狀態欄不會被隱藏覆蓋,狀態欄依然可見,Activity頂端布局部分會被狀態遮住。
主要需要用到的參數就是以上的幾個,其他的參數在實際的開發中用的相對較少,這里也就不列舉出來了。
通過上面的兩個地方的代碼設置之后,我們的APP就可以實現透明狀態欄的效果了。
普通界面的透明狀態欄.png
以上就是普通的界面設置透明狀態欄的方法。
Android 5.0透明狀態欄——帶DrawerLayout界面
帶有DrawerLayout的界面設置透明狀態欄,最終效果是和網易云音樂一樣的,方法其實和上面的差不多,但是有個小的地方需要注意,在這里我還是把代碼和方法都完整的講一遍。
帶有DrawerLayout的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorPrimary"
tools:openDrawer="start">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:orientation="vertical">
<include
layout="@layout/app_bar_main"/>
</LinearLayout>
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:headerLayout="@layout/nav_header_main"
app:menu="@menu/activity_main_drawer"/>
</android.support.v4.widget.DrawerLayout>
在這里說一下要注意的幾個點:
- 這個
<LinearLayout> ... </LinearLayout>
的作用,我之前沒有用這個<LinearLayout>
包裹Toolbar
,結果怎么設置,都不能實現非常完美的透明狀態欄,要么是statusbar顏色問題,要么是statusbar和NavigationView顏色不統一的問題。后來查找了很多資料,在一個小角落里面發現了,需要外層用<LinearLayout>
包裹一下,這樣的話就可以非常完美的顯示出網易云音樂的效果了。 -
NavigationView
里面設置的android:fitsSystemWindows="true"
,這個也是為了讓側邊欄即抽屜能夠和狀態欄顏色統一。 -
<include ... />
里面就是正常的設置Toolbar
什么的了,但是要注意在Toolbar
布局的最外層中也記得要添加android:fitsSystemWindows="true"
在布局文件中設置完畢之后,接著就是在代碼中設置了,在onCreate()
里面加上如下的代碼:
- 設置狀態欄顏色為透明:
getWindow().setStatusBarColor(Color.TRANSPARENT);
- 設置狀態欄和APP的位置關系:
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
將以上的所有代碼都設置完畢之后,最終呈現的效果如下:
沒有打開抽屜.png
打開抽屜
至此,我們已經在Android 5.0上實現透明狀態欄。但是對于這樣的透明狀態欄,我個人是不推薦的。因為我們進行的Android開發,而這個透明狀態欄卻給人一種IOS的風格,Android開發就應該從方方面面都能夠體現出Android的特性。雖然在Android 5.0之前,Android的UI風格一直都慘不忍睹,但是我們一路都堅持下來了,而在Android 5.0之后,因為Material Design的推出,Android的顏值可以說是提升了非常多。所以我們開發人員更應該開發Pure Android的程序,而不是模仿和抄襲IOS的各種風格。