聲明
這篇文章是針對Android 5.0及以上版本的系統(tǒng)進行透明的狀態(tài)欄設(shè)置慎冤,Android 5.0以下的系統(tǒng)暫不在本篇文章的討論范圍之內(nèi)癞埠。
Android 5.0透明狀態(tài)欄——普通界面
先貼出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>
上面的代碼中兼犯,最主要的兩行分別是:
- 設(shè)置最外層布局背景色為Toolbar的顏色:
android:background="@color/colorPrimary"
- 設(shè)置Toolbar不擴展到狀態(tài)欄:
android:fitsSystemWindows="true"
在布局文件中設(shè)置完畢后爷光,還需要在onCreate()
里面加上如下的代碼: - 設(shè)置狀態(tài)欄顏色為透明:
getWindow().setStatusBarColor(Color.TRANSPARENT);
- 設(shè)置狀態(tài)欄和APP的位置關(guān)系:
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
setSystemUiVisibility(int visibility)傳入的實參類型如下:
- View.SYSTEM_UI_FLAG_VISIBLE:顯示狀態(tài)欄,Activity不全屏顯示(恢復到有狀態(tài)的正常情況)郑原。
- View.INVISIBLE:隱藏狀態(tài)欄腌紧,同時Activity會伸展全屏顯示茸习。
- View.SYSTEM_UI_FLAG_FULLSCREEN:Activity全屏顯示,且狀態(tài)欄被隱藏覆蓋掉壁肋。
- View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN:Activity全屏顯示号胚,但狀態(tài)欄不會被隱藏覆蓋籽慢,狀態(tài)欄依然可見,Activity頂端布局部分會被狀態(tài)遮住猫胁。
主要需要用到的參數(shù)就是以上的幾個箱亿,其他的參數(shù)在實際的開發(fā)中用的相對較少,這里也就不列舉出來了杜漠。
通過上面的兩個地方的代碼設(shè)置之后极景,我們的APP就可以實現(xiàn)透明狀態(tài)欄的效果了。
以上就是普通的界面設(shè)置透明狀態(tài)欄的方法驾茴。
Android 5.0透明狀態(tài)欄——帶DrawerLayout界面
帶有DrawerLayout的界面設(shè)置透明狀態(tài)欄,最終效果是和網(wǎng)易云音樂一樣的氢卡,方法其實和上面的差不多势决,但是有個小的地方需要注意判哥,在這里我還是把代碼和方法都完整的講一遍。
帶有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
胞枕,結(jié)果怎么設(shè)置,都不能實現(xiàn)非常完美的透明狀態(tài)欄人弓,要么是statusbar顏色問題癞季,要么是statusbar和NavigationView顏色不統(tǒng)一的問題。后來查找了很多資料阁吝,在一個小角落里面發(fā)現(xiàn)了砚婆,需要外層用<LinearLayout>
包裹一下,這樣的話就可以非常完美的顯示出網(wǎng)易云音樂的效果了突勇。 -
NavigationView
里面設(shè)置的android:fitsSystemWindows="true"
装盯,這個也是為了讓側(cè)邊欄即抽屜能夠和狀態(tài)欄顏色統(tǒng)一。 -
<include ... />
里面就是正常的設(shè)置Toolbar
什么的了甲馋,但是要注意在Toolbar
布局的最外層中也記得要添加android:fitsSystemWindows="true"
在布局文件中設(shè)置完畢之后埂奈,接著就是在代碼中設(shè)置了,在onCreate()
里面加上如下的代碼:
- 設(shè)置狀態(tài)欄顏色為透明:
getWindow().setStatusBarColor(Color.TRANSPARENT);
- 設(shè)置狀態(tài)欄和APP的位置關(guān)系:
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
將以上的所有代碼都設(shè)置完畢之后定躏,最終呈現(xiàn)的效果如下:
至此账磺,我們已經(jīng)在Android 5.0上實現(xiàn)透明狀態(tài)欄。但是對于這樣的透明狀態(tài)欄痊远,我個人是不推薦的垮抗。因為我們進行的Android開發(fā),而這個透明狀態(tài)欄卻給人一種IOS的風格拗引,Android開發(fā)就應該從方方面面都能夠體現(xiàn)出Android的特性借宵。雖然在Android 5.0之前,Android的UI風格一直都慘不忍睹矾削,但是我們一路都堅持下來了壤玫,而在Android 5.0之后豁护,因為Material Design的推出,Android的顏值可以說是提升了非常多欲间。所以我們開發(fā)人員更應該開發(fā)Pure Android的程序楚里,而不是模仿和抄襲IOS的各種風格。