Android 实现渐变色状态栏

Posted 星火燎原2016

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于Android 实现渐变色状态栏的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中将状态栏背景设置为渐变色或drawable

iOS UIColor与16进制颜色互转,渐变色绘制以及纯色图片生成(可以半透明)

Android之UI--重绘EditText以及实现Button的渐变色

Android——实现渐变色水波纹效果源码

Android TextView 渐变色

iOS navigationBar和tabBar变透明 & navigationBar根据滑动距离的渐变色实现