Android 5.0以上Material Design 沉浸式狀態欄

偶然在知乎上看到這個問題,Android 5.0 如何實現將佈局的內容延伸到狀態欄,以前也見過多個應用的這個功能,可是知乎上的答案卻沒有一個真正實現此功能的
一類是把標題欄設置App主題顏色,一類是提取App主題顏色而後設置成狀態欄的顏色,這兩種方法都只是設置了狀態欄的背景色,而沒有實現佈局延伸到狀態欄這個功能

 


下面是綜合網上的一些東西整理的,廢話不說,看代碼
1
public class MainActivity extends Activity { 2 3 @SuppressLint("InlinedApi") 4 @Override 5 protected void onCreate(Bundle savedInstanceState) { 6 super.onCreate(savedInstanceState); 7 getWindow().requestFeature(Window.FEATURE_NO_TITLE); 8 if(VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP) { 9 Window window = getWindow(); 10 window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS 11 | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); 12 window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 13 | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 14 | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); 15 window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 16 window.setStatusBarColor(Color.TRANSPARENT); 17 window.setNavigationBarColor(Color.TRANSPARENT); 18 } 19 20 setContentView(R.layout.activity_main); 21 } 22 }

1, 第一次見到InlinedApi這個註解,網上給出的解釋是
"InlinedApi": Finds inlined fields that may or may not work on older platforms
大體意思是低版本的SDK可能不會起做用,這個能夠不用管

2,
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
                     | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
window.clearFlags 源碼:
public void clearFlags(int flags) {
    setFlags(0, flags);
}
FLAG_TRANSLUCENT_STATUS //透明狀態欄
FLAG_TRANSLUCENT_NAVIGATION //透明導航欄
3, setSystemUiVisibility這個方法參數表示的狀態比較多,具體以下: 1. View.SYSTEM_UI_FLAG_VISIBLE:顯示狀態欄,Activity不全屏顯示(恢復到有狀態的正常狀況)。 2. View.INVISIBLE:隱藏狀態欄,同時Activity會伸展全屏顯示。 3. View.SYSTEM_UI_FLAG_FULLSCREEN:Activity全屏顯示,且狀態欄被隱藏覆蓋掉。 4. View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN:Activity全屏顯示,但狀態欄不會被隱藏覆蓋,狀態欄依然可見,Activity頂端佈局部分會被狀態遮住。 5. View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION:效果同View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 6. View.SYSTEM_UI_LAYOUT_FLAGS:效果同View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 7. View.SYSTEM_UI_FLAG_HIDE_NAVIGATION:隱藏虛擬按鍵(導航欄)。有些手機會用虛擬按鍵來代替物理按鍵。 8. View.SYSTEM_UI_FLAG_LOW_PROFILE:狀態欄顯示處於低能顯示狀態(low profile模式),狀態欄上一些圖標顯示會被隱藏。

4,
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
Flag代表這個窗口負責繪製系統狀態欄標題欄的背景。若是設置,系統bar繪製成透明背景,在這個窗口相應的地方會填充{@link Window#getStatusBarColor()}和{@link Window#getNavigationBarColor()}對應的顏色。
相關文章
相關標籤/搜索