Android應用中經常會有一些要求全屏顯隱狀態欄導航欄的需求,通過全屏沉浸式的處理可以讓應用達到更好的顯示效果,下面系統的講解一下有關全屏,隱藏狀態欄導航欄,沉浸式的知識,
獲取狀態欄高度
新建一個StatusBarUtils.java檔案,在里面添加一個獲取狀態欄高度的方法,以后我們都會用的到這個方法,之后我們的核心代碼也在這個工具類里實作,代碼如下:
public class StatusBarUtils {
public static int getHeight(Context context) {
int statusBarHeight = 0;
try {
int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen",
"android");
if (resourceId > 0) {
statusBarHeight = context.getResources().getDimensionPixelSize(resourceId);
}
} catch (Exception e) {
e.printStackTrace();
}
return statusBarHeight;
}
}
設定全屏
在Android4.1以及更高版本可以使用setSystemUiVisibility來控制SystemUI,為了更系統的講解,不分別按照效果來講,而是把用到的flag先列出來一起講,以下flag經過互相組合能達到全屏隱藏狀態欄,全屏隱藏導航欄,全屏顯示狀態欄導航欄等很多不同效果,
控制SystemBar相關:
- SYSTEM_UI_FLAG_FULLSCREEN
- SYSTEM_UI_FLAG_HIDE_NAVIGATION
- SYSTEM_UI_FLAG_LOW_PROFILE
布局相關:
- SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
- SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
- SYSTEM_UI_FLAG_LAYOUT_STABLE
沉浸式相關 (4.4 引入):
- SYSTEM_UI_IMMERSIVE
- SYSTEM_UI_IMMERSIVE_STICKY
控制 SystemBar 相關
SYSTEM_UI_FLAG_FULLSCREEN
該屬性是用來隱藏狀態欄的,
public static void hideStatusBar(@NonNull Window window, @ColorInt int color) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
int uiOption=View.SYSTEM_UI_FLAG_FULLSCREEN;
//呼叫該方法,狀態欄將變成隱藏,狀態欄將變成純黑色
window.getDecorView().setSystemUiVisibility(uiOption);
}
}
效果圖如下,注意看頂部狀態欄
SYSTEM_UI_HIDE_NAVIGATION
該屬性是用來隱藏導航欄的,
- 點擊任意布局中的任意位置都會導致導航欄導航欄重新顯示出來
- 并且布局也會隨著狀態欄導航欄的顯隱進行布局調整進行重繪,
public static void hideNavigationBar(@NonNull Window window, @ColorInt int color) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
int uiOption = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
window.getDecorView().setSystemUiVisibility(uiOption);
}
}
效果圖如下,注意看底部導航欄

SYSTEM_UI_LOW_PROFILE
這個屬性的能力是讓SystemBar在視覺上變得模糊,重要性變得更低一點,具體表現是狀態欄圖示僅保留電量時間關鍵圖示,并且變暗,導航欄圖示變成三個點或者變暗,這個flag使用的很少,
View decorView = getWindow().getDecorView();
int uiOption = View.SYSTEM_UI_FLAG_LOW_PROFILE;
decorView.setSystemUiVisibility(uiOption);
布局相關
在新的Android4.1以及之后新的SystemUI設定里,僅單獨設定隱藏狀態欄和導航欄的flag會導致布局重繪,為了在顯隱狀態欄和導航欄的時候保持布局的穩定的顯示效果,就需要以下屬性了,
SYSTEM_UI_FLAG_LAYOUT_STABLE
該flag的作用是保持布局穩定,避免在顯隱狀態欄導航欄的時候發生布局的變化,可以輔助以下SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN、SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION兩個flag的使用,讓應用保持全屏的情況下,布局不隨狀態欄導航欄顯隱發生變化,也可以不配合這兩個flag使用,也能達到保持布局穩定的效果,不過不能實作全屏,會留出狀態欄和導航欄的位置,
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
可以讓布局延伸到狀態欄的位置,在狀態欄在隱藏和顯示之前切換的時候,布局穩定的顯示在狀態欄后面(如果顯示狀態欄則布局在狀態欄后面,隱藏狀態欄布局也不變),
- 當滑動systembar、點擊home鍵menu鍵就會清除掉flag,狀態欄會重新顯示出來
- 布局不會隨著狀態欄的顯隱進行調整變化
SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
可以讓布局延伸到導航欄的位置,可以讓導航欄在隱藏和顯示之前切換的時候,布局穩定的顯示在導航欄后面(如果顯示導航欄則在導航欄后面,隱藏導航欄也不變),
- 點擊任意布局就會清除掉flag,狀態欄導航欄會重新顯示出來
- 布局不會隨著狀態欄導航欄的顯隱進行調整變化,
參考鏈接
Android沉浸式全屏講解(狀態欄、導航欄處理)
從0到1優雅實作沉浸式狀態欄
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/292208.html
標籤:其他
