最近研究项目的状态栏变色问题,该特性国内也称为沉浸式状态栏(其实这是有误的,但是国内都这么叫了,一般就都这么认为了。)
该特性在5.0上是很好实现的,直接设置主题中的colorPrimaryDark
属性就可以了,但是由于4.4上就可以实现状态栏的透明,也就导致也可以在4.4的设备上实现状态栏变色,之前看过相关的处理方法,但是多少有点瑕疵,后来自己研究了一个方法,在此分享下。
主要思路就是设置状态栏为透明,然后绘制一个和状态栏同样高度的矩形,添加到窗口的顶层View上面,再设置根布局的fitsSystemWindows
参数为true
。
具体代码如下:
/**
* 状态栏变色处理 4.4以上
*
* @param color 状态栏颜色
* 4.4状态栏显示为改颜色
* 5.0自动会加上半透明效果
*/
public void translucentBar(int color) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
// 获取状态栏高度
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
int statusBarHeight = getResources().getDimensionPixelSize(resourceId);
// 绘制一个和状态栏一样高的矩形,并添加到视图中
View rectView = new View(this);
LinearLayout.LayoutParams params
= new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, statusBarHeight);
rectView.setLayoutParams(params);
rectView.setBackgroundColor(getResources().getColor(color));
// 添加矩形View到布局中
ViewGroup decorView = (ViewGroup) getWindow().getDecorView();
decorView.addView(rectView);
// 设置根布局的参数
ViewGroup rootView = (ViewGroup) ((ViewGroup) this.findViewById(android.R.id.content)).getChildAt(0);
rootView.setFitsSystemWindows(true);
rootView.setClipToPadding(true);
}
}
具体的参数注释中已经说明了。
该方法需要在setContentView()
方法之后调用。
重写BaseActivity中的setContentView(int layoutResID )
方法,就可以实现全局地设置所有的Activity界面的状态栏颜色,如果项目中某个Activity需要设置不同的状态栏颜色,显式地调用该方法,并传入颜色值即可。
当给参数为green时,运行的效果如下(左边为4.4,右边为5.0):
由于是模拟器的原因,实际上4.4上就是你设置的颜色值,5.0上会自动加上半透明的效果。
至此,4.4及其以上的状态栏变色问题就得到了解决,并保证了系统上的风格统一。