Android 實現漸變色狀態欄

漸變色狀態欄變得越來越流行了, 剛好最近有這樣的需求, 現將實現過程記錄下來.
效果圖:

Android 5.0 以上版本(左邊) :                          Android 4.4 以上版本(右邊):
  

實現思路

我們都知道, 在高於 4.4 低於 5.0 版本上實現純色狀態欄, 是將狀態欄透明,然後創建一個與狀態欄等高的 View, 設置背景色,放在狀態欄位置上即可.

現需要設置爲漸變色,由於系統沒有提供狀態欄設置漸變色 API, 所以我們可以借鑑在 4.4 上實現純色狀態欄的思路, 只是 View 的背景設置爲漸變色 Drawable 即可.

   /**
     * 設置狀態欄 Drawable,比如漸變色
     *
     * @param activity
     * @param drawableId
     */
    public static void setDrawable(Activity activity, @DrawableRes int drawableId) {
        Drawable drawable = activity.getResources().getDrawable(drawableId);
        setDrawable(activity, drawable);
    }


    /**
     * 設置狀態欄 Drawable
     * @param activity
     * @param drawable
     */
    public static void setDrawable(Activity activity, Drawable drawable) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            // 去掉半透明
            activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            // 狀態欄設置透明
            activity.getWindow().setStatusBarColor(activity.getResources().getColor(android.R.color.transparent));
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }
        ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
        View fakeStatusBarView = decorView.findViewById(FAKE_STATUS_BAR_VIEW_ID);
        // Activity 已經添加過了 statusBarView , 則修改背景顏色
        if (fakeStatusBarView != null) {
            if (fakeStatusBarView.getVisibility() == View.GONE) {
                fakeStatusBarView.setVisibility(View.VISIBLE);
            }
            fakeStatusBarView.setBackground(drawable);
        } else { // 沒有添加過,則添加一個 statusBarView
            // decorView 中添加一個與狀態欄大小的 view
            decorView.addView(createStatusBarDrawableView(activity, drawable));
        }
        setRootView(activity);
    }


    /**
     * 生成一個和狀態欄大小相同的矩形條,並設置背景爲 drawable
     *
     * @param activity
     * @param drawable
     * @return
     */
    private static View createStatusBarDrawableView(Activity activity, Drawable drawable) {
        // 繪製一個和狀態欄一樣高的矩形
        View statusBarView = new View(activity);
        LinearLayout.LayoutParams params =
                new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity));
        statusBarView.setLayoutParams(params);
        statusBarView.setBackground(drawable);
        statusBarView.setId(FAKE_STATUS_BAR_VIEW_ID);
        return statusBarView;
    }  


在 Fragment / DrawerLayout 中調用和 StatusBarUtil 中 setColor() 方式一樣,
調用方式:

StatusBarUtil.setDrawable(this, R.drawable.gradient_status_bg);

源碼: https://github.com/xing16/ProgressAndroid 中 GradientStatusBarActivity.java

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章