/** * 設置透明狀態欄與導航欄 * @param navi true不設置導航欄|false設置導航欄 */ public void setStatusBar(boolean navi) { //api>21,全透明狀態欄和導航欄;api>19,半透明狀態欄和導航欄 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Window window = getWindow(); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.setStatusBarColor(Color.TRANSPARENT); if (navi) { window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN//狀態欄不會被隱藏但activity佈局會擴展到狀態欄所在位置 | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION//導航欄不會被隱藏但activity佈局會擴展到導航欄所在位置 | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); window.setNavigationBarColor(Color.TRANSPARENT); } else { window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); } } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { if (navi) { //半透明導航欄 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); } //半透明狀態欄 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } }
/** * 進入沉浸模式 * @param view view */ @TargetApi(Build.VERSION_CODES.JELLY_BEAN) public static void hideSystemUI(View view) { view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY//會自動隱藏 ); } /** * 退出沉浸模式 * @param view view */ @TargetApi(Build.VERSION_CODES.JELLY_BEAN) public static void showSystemUI(View view) { view.setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); }
注意:狀態欄或導航欄進行透明處理以後,我們的佈局內容是會擴展到原來狀態欄與導航欄的位置,可是這樣就會形成狀態欄顯示的內容與咱們的佈局內容重疊,因此接下來
還須要進行一步處理,本人偷懶因此只是在代碼中獲取頁面最上面的控件進行paddingTop出狀態欄的高度(國內大多數品牌的手機都是沒有底部導航欄的,因此不作處理)
獲取狀態欄高度的代碼:
/** * 獲取狀態欄高度 * * @param context 上下文 * @return 狀態欄高度 */ public int getStatusBarHeight(Context context) { int statusBarHeight = 0; try { Class<?> clazz = Class.forName("com.android.internal.R$dimen"); Object obj = clazz.newInstance(); Field field = clazz.getField("status_bar_height"); int temp = Integer.parseInt(field.get(obj).toString()); statusBarHeight = context.getResources().getDimensionPixelSize(temp); } catch (Exception e) { e.printStackTrace(); } return statusBarHeight; }主要的幾個flag:public static final int SYSTEM_UI_FLAG_HIDE_NAVIGATION = 0x00000002; 隱藏導航欄public static final int SYSTEM_UI_FLAG_FULLSCREEN = 0x00000004; 字面意思是全屏顯示,實際是狀態欄會被隱藏而導航欄未做處理public static final int SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION = 0x00000200; 導航欄不會被隱藏但佈局會擴展到導航欄所在位置public static final int SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN = 0x00000400; 狀態欄不會被隱藏但佈局會擴展到狀態欄所在位置public static final int SYSTEM_UI_FLAG_IMMERSIVE = 0x00000800; 配合SYSTEM_UI_FLAG_HIDE_NAVIGATION使用,若是隻有SYSTEM_UI_FLAG_HIDE_NAVIGATION而不設置SYSTEM_UI_FLAG_IMMERSIVE,那麼用戶交互後會自動清除SYSTEM_UI_FLAG_HIDE_NAVIGATION這個flag;public static final int SYSTEM_UI_FLAG_IMMERSIVE_STICKY = 0x00001000; 配合SYSTEM_UI_FLAG_HIDE_NAVIGATION和(或)SYSTEM_UI_FLAG_FULLSCREEN使用,設置這個flag以後,用戶在屏幕頂部下滑或者在底部上滑調出狀態欄、導航欄以後它們仍會自動隱藏;