1、定义渐变资源文件bg_title_gradient.xml:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:angle="180"
android:endColor="#6685FF"
android:startColor="#245DF3" />
</shape>
2、在BaseActivity中设置状态栏颜色:
public abstract class BaseActivity extends AppCompatActivity {
public Activity mActivity;
private View statusBarView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mActivity = this;
if (Build.VERSION.SDK_INT >= 21) {
setStatusBarView();
}
}
/**
* 设置状态栏(渐变)
* <p>
* https://www.jb51.net/article/124110.htm
* <p>
* https://blog.csdn.net/u010127332/article/details/81502950
*/
private void setStatusBarView() {
//延时加载数据,保证Statusbar绘制完成后再findview。
Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() {
@Override
public boolean queueIdle() {
initStatusBar();
//不加监听,也能实现改变statusbar颜色的效果。但是会出现问题:比如弹软键盘后,弹popwindow后,引起window状态改变时,statusbar的颜色就会复原.
getWindow().getDecorView().addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
initStatusBar();
getWindow().getDecorView().removeOnLayoutChangeListener(this);
}
});
//只走一次
return false;
}
});
}
/**
* 颜色渐变
*/
private void initStatusBar() {
if (statusBarView == null) {
//利用反射机制修改状态栏背景
int identifier = getResources().getIdentifier("statusBarBackground", "id", "android");
statusBarView = getWindow().findViewById(identifier);
}
if (statusBarView != null) {
statusBarView.setBackgroundResource(R.drawable.bg_title_gradient);
} else {
LegoLog.w("statusBarView is null.");
}
}
}
3、存在问题:
- 不支持4.4以下版本;
- 使用Looper.myQueue().addIdleHandler()来保证Statusbar绘制完成后再findview;导致页面跳转时有明显的过度效果。