做項目遇到沉浸式狀態欄的實現,在此記錄一下。
隨着Android自身改進,API的迭代更新,對於不同版本的Android系統來說,沉浸式狀態欄的實現有些差異,大致分為三種:
-
Android4.4(API 19) - Android 5.0(API 21): 這個階段可以實現沉浸式,但是表現得還不是很好,實現方式為: 通過
FLAG_TRANSLUCENT_STATUS
設置狀態欄為透明並且為全屏模式,然后通過添加一個與StatusBar 一樣大小的View,將View 的 background 設置為我們想要的顏色,從而來實現沉浸式。 -
Android 5.0(API 21)以上版本: 在Android 5.0的時候,加入了一個重要的屬性和方法
android:statusBarColor
(對應方法為 setStatusBarColor),通過這個方法我們就可以輕松實現沉浸式。也就是說,從Android5.0開始,系統才真正的支持沉浸式。 -
Android 6.0(API 23)以上版本:其實Android6.0以上的實現方式和Android 5.0 +是一樣,為什么要將它歸為一個單獨重要的階段呢?是因為從Android 6.0(API 23)開始,我們可以改狀態欄的繪制模式,可以顯示白色或淺黑色的內容和圖標(除了魅族手機,魅族自家有做源碼更改,6.0以下就能實現)
setSystemUiVisibility(int visibility)傳入的實參類型如下:
1.SYSTEM_UI_FLAG_VISIBLE :狀態欄和Activity共存,Activity不全屏顯示。也就是應用平常的顯示畫面
2.SYSTEM_UI_FLAG_FULLSCREEN :Activity全屏顯示,且狀態欄被覆蓋掉;
3.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN :Activity全屏顯示,但是狀態欄不會被覆蓋掉;
4.SYSTEM_UI_FLAG_HIDE_NAVIGATION:導航欄不顯示,布局延伸到導航欄;
5.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION:導航欄顯示,布局延伸到導航欄;
6.SYSTEM_UI_FLAG_LAYOUT_STABLE:在設置全屏時,加上這個標志位以后,布局不會占用狀態欄的空間;
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //Android 6.0 以上 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); } else{ //Android 5.0-6.0 //繪制透明的狀態欄(最上)和導航欄(最下) getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); //注意要清除 FLAG_TRANSLUCENT_STATUS flag getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); //給透明狀態欄填充顏色 getWindow().setStatusBarColor(getResources().getColor(R.color.green)); //給透明導航欄填充顏色 //getWindow().setNavigationBarColor(getResources().getColor(R.color.green)); } } }
實現效果(左側為Android 11.0-API30,右側為Android5.1-API22):
參考文檔: