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()を使用して、ビューを見つける前にステータスバーが描画されることを確認します。これにより、ページがジャンプしたときに明らかに過度の影響が生じます。