漸變色狀態欄變得越來越流行了, 剛好最近有這樣的需求, 現將實現過程記錄下來.
效果圖:
Android 5.0 以上版本(左邊) : Android 4.4 以上版本(右邊):
實現思路
我們都知道, 在高於 4.4 低於 5.0 版本上實現純色狀態欄, 是將狀態欄透明,然後創建一個與狀態欄等高的 View, 設置背景色,放在狀態欄位置上即可.
現需要設置爲漸變色,由於系統沒有提供狀態欄設置漸變色 API, 所以我們可以借鑑在 4.4 上實現純色狀態欄的思路, 只是 View 的背景設置爲漸變色 Drawable 即可.
/**
* 設置狀態欄 Drawable,比如漸變色
*
* @param activity
* @param drawableId
*/
public static void setDrawable(Activity activity, @DrawableRes int drawableId) {
Drawable drawable = activity.getResources().getDrawable(drawableId);
setDrawable(activity, drawable);
}
/**
* 設置狀態欄 Drawable
* @param activity
* @param drawable
*/
public static void setDrawable(Activity activity, Drawable drawable) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
// 去掉半透明
activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
// 狀態欄設置透明
activity.getWindow().setStatusBarColor(activity.getResources().getColor(android.R.color.transparent));
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
View fakeStatusBarView = decorView.findViewById(FAKE_STATUS_BAR_VIEW_ID);
// Activity 已經添加過了 statusBarView , 則修改背景顏色
if (fakeStatusBarView != null) {
if (fakeStatusBarView.getVisibility() == View.GONE) {
fakeStatusBarView.setVisibility(View.VISIBLE);
}
fakeStatusBarView.setBackground(drawable);
} else { // 沒有添加過,則添加一個 statusBarView
// decorView 中添加一個與狀態欄大小的 view
decorView.addView(createStatusBarDrawableView(activity, drawable));
}
setRootView(activity);
}
/**
* 生成一個和狀態欄大小相同的矩形條,並設置背景爲 drawable
*
* @param activity
* @param drawable
* @return
*/
private static View createStatusBarDrawableView(Activity activity, Drawable drawable) {
// 繪製一個和狀態欄一樣高的矩形
View statusBarView = new View(activity);
LinearLayout.LayoutParams params =
new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity));
statusBarView.setLayoutParams(params);
statusBarView.setBackground(drawable);
statusBarView.setId(FAKE_STATUS_BAR_VIEW_ID);
return statusBarView;
}
在 Fragment / DrawerLayout 中調用和 StatusBarUtil 中 setColor() 方式一樣,
調用方式:
StatusBarUtil.setDrawable(this, R.drawable.gradient_status_bg);
源碼: https://github.com/xing16/ProgressAndroid 中 GradientStatusBarActivity.java