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来判断是不是白底。
完美适配!