根據(jù)狀態(tài)欄顏色亮度設(shè)置黑白字體(Android 6.0及以上版本)

背景顏色

直到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);

? ? }

}


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容