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

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