android 界面 UI 美化:沉浸模式、全透明或半透明狀態欄及導航欄的實現

JonelleHamb 7年前發布 | 11K 次閱讀 安卓開發 Android開發 移動開發

android api19開始我們就能對頂部狀態欄和底部導航欄進行半透明處理了,而api21開始則可以實現全透明狀態欄與導航欄以及開啟沉浸模式,至于什么是沉浸模式,大家百度一下應該就都知道了,有一點需要強調的是全透明不是沉浸模式,前者只是將狀態欄、導航欄的背景設置為完全透明,而后者則是完全將狀態欄與導航欄隱藏并且只要在屏幕頂部下滑或在底部上滑就能短暫呼出狀態欄與導航欄當然幾秒鐘之后還是會隱藏的;

下面三張圖的效果分別是:普通狀態欄,半透明狀態欄,全透明狀態欄

下面看方法:

/**
 * 設置透明狀態欄與導航欄
 * @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之后,用戶在屏幕頂部下滑或者在底部上滑調出狀態欄、導航欄之后它們仍會自動隱藏;

 

來自:http://blog.csdn.net/dovar_66/article/details/52688313

 

 本文由用戶 JonelleHamb 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!