從Android4.4開始提供的沉浸式狀態欄,讓APP設計得更優美,很多APP都采用了。對於沉浸式狀態欄的理解,很多人都表達不太一樣,在這里根據自己的理解分為透明狀態欄和沉浸式狀態欄,分別對4.4和5.0進行適配。
布局
1
2
3
4
5
6
7
8
9
10
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@mipmap/bg"
android:scaleType="fitXY"/>
</RelativeLayout>
|
透明狀態欄
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)支持4.4及以上版本,透明(4.4以上),半透明(5.0以上)),所以5.0以上全透明單獨適配。
1
2
3
4
5
6
7
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
getWindow().setStatusBarColor(Color.TRANSPARENT);
}
else
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
|

透明狀態欄和導航欄
代碼設置:
1
2
3
4
5
6
7
8
9
10
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
getWindow().setStatusBarColor(Color.TRANSPARENT);
getWindow().setNavigationBarColor(Color.TRANSPARENT);
}
else
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
| WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}
|

真正的沉浸式狀態欄
狀態欄和導航欄在4.4以上半透明,在5.0以上不透明。
1
2
3
4
5
6
7
8
9
10
11
12
|
super.onWindowFocusChanged(hasFocus);
if (hasFocus && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}
}
|

主要有兩種情況:純色和漸變色。
純色
最簡單的方式就是colorPrimary和colorPrimaryDark設為同一個顏色:
1
2
3
4
5
6
|
<style name=
"AppTheme" parent=
"Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimary</item>
<item name="colorAccent">@color/colorAccent</item>
</style
|
在代碼中設置的話,SDK21及以上可以使用getWindow().setStatusBarColor()方法設置顏色,在SDK19及以上需要找到狀態欄View,然后設置背景顏色
1
|
getWindow().setStatusBarColor(Color.TRANSPARENT);
|
還可將狀態欄的顏色設為透明,然后將ToolBar的內容擴展到狀態欄上,具體方法看下面漸變色的介紹
漸變色
要實現漸變色,ToolBar和狀態欄的顏色不好單獨設置,可以給ToolBar設置顏色后擴展到狀態欄上。
漸變色可以使用shape創建,也可以用圖片。使用gradient設置漸變色:
1
2
3
4
5
6
7
|
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient
android:angle="90"
android:startColor="#7f99a8"
android:endColor="#8ea8b7"
android:type="linear"/>
</shape>
|
toolbar.setFitsSystemWindows(true)將ToolBar的內容擴展到狀態欄,讓ToolBar的內容不與狀態欄重疊。在代碼中實現:
1
2
3
4
5
6
7
8
9
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
getWindow().setStatusBarColor(Color.TRANSPARENT);
toolbar.setFitsSystemWindows(
true);
}
else
if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT){
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
toolbar.setFitsSystemWindows(
true);
}
|
