简单易懂的状态栏使用详解(2)---状态栏改颜色

说明:我尽量不打错别字,用词准确,不造成阅读障碍。

日常开发中我见过的状态栏效果只有“全透明”、“半透明”、“各种颜色”这三种了,如果是前两者,请参考我的另一篇文章 简单易懂的沉浸式状态栏使用详解(1)——状态栏全透明(含虚拟按键适配),本篇文章只讲如何简单快速无负担的达到沉浸式状态栏(颜色改变)的效果。

所有内容都是建立在Android 5.0和Android 4.4的模拟器上完成的,5.0以上的6.0和7.0、8.0都是和5.0一样的,6.0及以上可以将状态栏改成白底黑字的。

一.通过修改主题的方式(5.0及以上,5.0以下我不知道方法):

如果只是适配5.0以上的系统,因为现在国内其实大部分系统都是5.0以上的吧,这时只需要修改主题就好:

<itemname="android:statusBarColor">@android:color/transparent</item>

“@android:color/transparent”可以随便改成自己的colors文件里面的颜色,然后Manifest中设置到具体的activity中就好了。


二.通过代码的方式修改:

这种方式也是要分为5.0及以上和5.0以下的:

5.0及以上:

直接设置代码就好

getWindow().setStatusBarColor(getResources().getColor(R.color.red));

为了兼容5.0以下

private static final int FAKE_STATUS_BAR_VIEW_ID = R.id.statusbarutil_fake_status_bar_view;

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            getWindow().setStatusBarColor(color);
   } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        ViewGroup decorView = (ViewGroup) getWindow().getDecorView();
        View fakeStatusBarView = decorView.findViewById(FAKE_STATUS_BAR_VIEW_ID);
        if (fakeStatusBarView != null) {
            if (fakeStatusBarView.getVisibility() == View.GONE) {
                 fakeStatusBarView.setVisibility(View.VISIBLE);
              }
               fakeStatusBarView.setBackgroundColor(calculateStatusColor(color, alpha));
           } else {
               decorView.addView(createStatusBarView(activity, color, alpha));
           }
       }

         /**
     * 生成一个和状态栏大小相同的半透明矩形条
     *
     * @param activity 需要设置的activity
     * @param color    状态栏颜色值
     * @param alpha    透明值
     * @return 状态栏矩形条
     */
    private static View createStatusBarView(Activity activity, @ColorInt int color, int alpha) {
        // 绘制一个和状态栏一样高的矩形
        View statusBarView = new View(activity);
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity));
        statusBarView.setLayoutParams(params);
        statusBarView.setBackgroundColor(calculateStatusColor(color, alpha));
        statusBarView.setId(FAKE_STATUS_BAR_VIEW_ID);
        return statusBarView;
    }

    /**
     * 计算状态栏颜色
     *
     * @param color color值
     * @param alpha alpha值
     * @return 最终的状态栏颜色
     */
    private static int calculateStatusColor(@ColorInt int color, int alpha) {
        if (alpha == 0) {
            return color;
        }
        float a = 1 - alpha / 255f;
        int red = color >> 16 & 0xff;
        int green = color >> 8 & 0xff;
        int blue = color & 0xff;
        red = (int) (red * a + 0.5);
        green = (int) (green * a + 0.5);
        blue = (int) (blue * a + 0.5);
        return 0xff << 24 | red << 16 | green << 8 | blue;
    }

    /**
     * 获取状态栏高度
     *
     * @param context context
     * @return 状态栏高度
     */
    private static int getStatusBarHeight(Context context) {
        // 获得状态栏高度
        int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
        return context.getResources().getDimensionPixelSize(resourceId);
    }
总体思想与上一篇一样,就是自己写一个有颜色的view去代替状态栏,这是参考别人的代码,推荐给大家:

https://github.com/laobie/StatusBarUtil

但是我觉得,如果只是做透明或者只适配5.0及以上系统,就不用引入这个依赖了,浪费,白耗资源。
总结一下两篇文章所写的:

如果只是适配5.0及以上,不管是改成透明的还是更改具体颜色,通过两种方式:

1.修改主题

2.修改代码(代码量不大,所以很方便)

如果要适配5.0以下,就要看是只改透明的还是改具体颜色

1.如果只改透明的就可以修改主题就好,改代码也行,就是代码量挺大。

2.如果要改具体的颜色,只能通过代码修改,且代码量不小。

参考及感谢:https://github.com/laobie/StatusBarUtil


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值