背景顏色
直到Android 5.0系統(tǒng)才提供了設(shè)置狀態(tài)欄背景顏色的方法,使用StatusBarUtil庫(kù)可以最低支持到Android 4.4,這個(gè)看起來(lái)是一個(gè)比較好的解決方案,但是狀態(tài)欄的顏色如果改為白色,那么就看不到狀態(tài)欄內(nèi)的文字了。
聰明的你肯定想到,把狀態(tài)欄內(nèi)的字體改為黑色的不就完了。
字體顏色
問(wèn)題就在字體顏色的修改上,小米的MIUI和魅族的Flyme在Android 4.4之后各自提供了自家的修改方法,其他品牌只能在Android 6.0及以后才能修改。
最初的想法是針對(duì)小米和魅族分別處理,其他系統(tǒng)在Android 6.0及以上才處理。經(jīng)過(guò)查看用戶分布(2018-02-23)Android 6.0之下占33.27%,小米用戶6.69%,魅族用戶1.08%。這樣一看都沒(méi)有必要對(duì)小米、魅族分別處理了,那就都統(tǒng)一到Android 6.0去設(shè)置吧。
/**
* Android 6.0 以上設(shè)置狀態(tài)欄顏色
*/
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
? ? ? ? // 設(shè)置狀態(tài)欄底色白色
? ? ? ? getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
? ? ? ? getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
? ? ? ? getWindow().setStatusBarColor(Color.WHITE);
? ? ? ? // 設(shè)置狀態(tài)欄字體黑色
? ? ? ? getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
? ? }
然后想下通用性不夠,如果以后我想設(shè)置其他顏色或者給其他人使用的時(shí)候,顯然就不夠用了。
希望這樣,根據(jù)狀態(tài)欄設(shè)置的顏色亮度來(lái)動(dòng)態(tài)配置是黑色字體還是白色字體。在stackoverflow上找到判斷一個(gè)顏色是亮色還是暗色的問(wèn)題 Check if color is dark or light in Android?,最簡(jiǎn)單的方式是調(diào)用support包中提供的計(jì)算顏色亮度的方法。
/**
* 判斷顏色是不是亮色
*/
private boolean isLightColor(@ColorInt int color) {
? ? return ColorUtils.calculateLuminance(color) >= 0.5;
}
定義一個(gè)基類,子類通過(guò)getStatusBarColor設(shè)置狀態(tài)欄顏色,然后根據(jù)顏色是亮色還是暗色,對(duì)字體顏色進(jìn)行設(shè)置。
public class BaseStatusBarActivity extends AppCompatActivity {
? ? @Override
? ? public void setContentView(int layoutResID) {
? ? ? ? super.setContentView(layoutResID);
? ? ? ? setStatusBar(getStatusBarColor());
? ? }
? ? @Override
? ? public void setContentView(View view) {
? ? ? ? super.setContentView(view);
? ? ? ? setStatusBar(getStatusBarColor());
? ? }
? ? /**
? ? * Android 6.0 以上設(shè)置狀態(tài)欄顏色
? ? */
? ? protected void setStatusBar(@ColorInt int color) {
? ? ? ? if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
? ? ? ? ? ? // 設(shè)置狀態(tài)欄底色顏色
? ? ? ? ? ? getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
? ? ? ? ? ? getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
? ? ? ? ? ? getWindow().setStatusBarColor(color);
? ? ? ? ? ? // 如果亮色,設(shè)置狀態(tài)欄文字為黑色
? ? ? ? ? ? if (isLightColor(color)) {
? ? ? ? ? ? ? ? getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? /**
? ? * 判斷顏色是不是亮色
? ? *
? ? * @param color
? ? * @return
? ? * @from https://stackoverflow.com/questions/24260853/check-if-color-is-dark-or-light-in-android
? ? */
? ? private boolean isLightColor(@ColorInt int color) {
? ? ? ? return ColorUtils.calculateLuminance(color) >= 0.5;
? ? }
? ? /**
? ? * 獲取StatusBar顏色,默認(rèn)白色
? ? *
? ? * @return
? ? */
? ? protected @ColorInt int getStatusBarColor() {
? ? ? ? return Color.WHITE;
? ? }
}
在使用的時(shí)候,直接繼承BaseStatusBarActivity即可:
public class MainActivity extends BaseStatusBarActivity {
? ? @Override
? ? protected void onCreate(Bundle savedInstanceState) {
? ? ? ? super.onCreate(savedInstanceState);
? ? ? ? setContentView(R.layout.activity_main);
? ? }
? ? @Override
? ? protected int getStatusBarColor() {
? ? ? ? return getResources().getColor(R.color.colorPrimary);
? ? }
}
想要?jiǎng)討B(tài)設(shè)置顏色,可以調(diào)用setStatusBar方法:
public class MainActivity extends BaseStatusBarActivity implements ColorPanelView.OnColorChangedListener {
? ? ColorPanelView mColorPanelView;
? ? @Override
? ? protected void onCreate(Bundle savedInstanceState) {
? ? ? ? super.onCreate(savedInstanceState);
? ? ? ? setContentView(R.layout.activity_main);
? ? ? ? mColorPanelView = findViewById(R.id.cpv);
? ? ? ? mColorPanelView.setOnColorChangedListener(this);
? ? }
? ? @Override
? ? public void onColorChanged(ColorPanelView view, int color) {
? ? ? ? setStatusBar(color);
? ? }
}