Android完美适配各版本状态栏

protected void setStatusBarColor(@ColorRes int colorResId) {

    int color = getResources().getColor(colorResId);

    //获取ColorInt的RGB
    float r = (color >> 16) & 0xff;
    float g = (color >> 8) & 0xff;
    float b = (color) & 0xff;

    //判断颜色深浅
    boolean isDeepColor;
    if (r * 0.299 + g * 0.578 + b * 0.114 >= 192) {
        isDeepColor = false;//浅色
    } else {
        isDeepColor = true;//深色
    }

    //根据颜色深浅,制定不同实现状态栏颜色的策略
    if (isDeepColor) {
        //深色,直接给状态栏设置颜色即可
        StatusBarCompat.setStatusBarColor(this, getResources().getColor(colorResId));
    } else {
        if (allView != null) {
            //对于小米魅族还以进行黑底白字适配
            ViewUtil.setStatusBarDark(this.getWindow(), true);
            //透明化状态栏
            StatusBarCompat.translucentStatusBar(this);
            //浅色,需要给状态栏添加一个View来作为状态栏背景色
            final RelativeLayout rl = (RelativeLayout) allView;

            //设置背景与尺寸
            View view = new View(this);
            view.setId(View.NO_ID);
            view.setBackgroundColor(getResources().getColor(colorResId));
            RelativeLayout.LayoutParams lp2 = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewUtil.getStatusBarHeight(this));
            view.setLayoutParams(lp2);

            rl.addView(view);

            //设置在背景bar下方
            View appBarLayout = findViewById(R.id.flight_base_appbar_layout);
            RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) appBarLayout.getLayoutParams();
            lp.addRule(RelativeLayout.BELOW, view.getId());

            findViewById(R.id.ll_flight_base_content).setFitsSystemWindows(true);
            appBarLayout.setFitsSystemWindows(true);
            ViewCompat.setOnApplyWindowInsetsListener(appBarLayout, null);//解决办法

            //这里有一个bug,toolbar始终会不听指挥,占用系统空间,给下面的控件声明了setFit,倒是会听指挥,根源解决要从toolbar和appbarlayout入手
        }
    }
}

这里不透露太多,就给部分代码体会下。

因为白底黑字只有4.4后的魅族小米,还有6.0后的所有机型可以实现,所以先要适配他们的。另外的机型在白底的时候仍然会呈现白字,解决办法是半透明化状态栏,但是半透明化的默认背景是白色的decorview的颜色,所以这里需要填充状态栏的空间,然后新增一个background view来顶替状态栏,需要setFitSys来保证子View正常绘制,也就是不占用sys空间。此外我这里appbarlayout构造方法里默认实现setOnApplyWindowInsetsListener,setFitSys对于appbarlayout是无效的,解决方法是借助ViewCompat来手动清楚掉这个listener。

然后最上面的代码是根据rgb来判断是不是白底。

完美适配!

猜你喜欢

转载自blog.csdn.net/qq_36523667/article/details/80933840