最近一直忙着写业务,一直没精力更新博客,趁着最近有点空闲事件,觉得很有必要写一篇博客捡回以前的那个状态。就写一个自己当时总结的一个适配功能吧:关于状态栏的字体/图标颜色适配。
随着Android6.0 Android7.0系统的系统升级,开发者来说适配的容易程度越来越低,我们需要将精力放到适配4.4+以上,而Android4.4相对来说是一个比较稳定的版本,尤其是在UI上它又和Android 6.0、Android7.0接近。
对于状态栏的,我记得之前我写过文章来实现着色的、透明的等各种样式的适配的文章,今天不再赘述。
我们要说的是今天的关于状态栏的字体/图标颜色。
状态字体颜色有区分 可能对于我这个被人成为”MI Body”的伪米粉来说,手里握着MI 5,听音乐用的小米耳机,还戴着小米手环,可能觉得小米最经典之作是小米定制的系统—MI UI。
当然除了Mi UI其他厂商也有定制,Flyme,EMUI,Color OS以及一加的氢OS,Smartisan OS等等,每款定制ROM都有其独特之处,不过个人已经习惯了Mi UI。 MI UI一个很好的体验就是状态的字体能够变色,黑色变白色,白色变黑色。
是不是很有意思,其他Android 6.0也就是我们说的Android N也是支持的。
猜想:Google下一步会不会把状态栏的字体和图标颜色也开放能设置成彩色呢?
那么如何来实现呢,这种适配呢?
适配状态栏的字体/图标颜色 由于国内的ROM如MI UI和Flyme已经修改过Android的源码,他们在Android 4.4 做了适配,而原生的系统则是在Android M上才能设置状态栏字体颜色。
我们需要自己去一个个判断适配:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 public void applay (Activity activity, boolean isDarkFont) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { IStatusBar statusBar = null ; if (OSUtils.isFlyme()) { statusBar = mStatusBars.get(StatusBarAdapter.FLYME); } else if (OSUtils.isMIUI()) { statusBar = mStatusBars.get(StatusBarAdapter.MIUI); } else if (OSUtils.isOSM()) { statusBar = mStatusBars.get(StatusBarAdapter.OS_M); } if (statusBar != null ) { statusBar.setStatusBarLightMode(activity, isDarkFont); } } }
小米的MIUI: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 import android.app.Activity;import android.view.Window;import java.lang.reflect.Field;import java.lang.reflect.Method;public class MiuiStatusbar implements IStatusBar { @Override public boolean setStatusBarLightMode (Activity activity, boolean isFontColorDark) { Window window = activity.getWindow(); boolean result = false ; try { if (window != null ) { Class clazz = window.getClass(); try { int darkModeFlag = 0 ; Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams" ); Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE" ); darkModeFlag = field.getInt(layoutParams); Method extraFlagField = clazz.getMethod("setExtraFlags" , int .class, int .class); if (isFontColorDark) { extraFlagField.invoke(window, darkModeFlag, darkModeFlag); } else { extraFlagField.invoke(window, 0 , darkModeFlag); } result = true ; } catch (Exception e) { e.printStackTrace(); } } } catch (Exception e) { e.printStackTrace(); } return result; } @Override public String getTypeName () { return StatusBarAdapter.MIUI; } }
魅族的Flyme 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 public class MeizuStatusBar implements IStatusBar { @Override public boolean setStatusBarLightMode (Activity activity, boolean isFontColorDark) { Window window = activity.getWindow(); boolean result = false ; try { if (window != null ) { try { WindowManager.LayoutParams lp = window.getAttributes(); Field darkFlag = WindowManager.LayoutParams.class .getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON" ); Field meizuFlags = WindowManager.LayoutParams.class .getDeclaredField("meizuFlags" ); darkFlag.setAccessible(true ); meizuFlags.setAccessible(true ); int bit = darkFlag.getInt(null ); int value = meizuFlags.getInt(lp); if (isFontColorDark) { value |= bit; } else { value &= ~bit; } meizuFlags.setInt(lp, value); window.setAttributes(lp); result = true ; } catch (Exception e) { e.printStackTrace(); } } } catch (Exception e) { e.printStackTrace(); } return result; } @Override public String getTypeName () { return StatusBarAdapter.FLYME; } }
Android M 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 import android.app.Activity;import android.os.Build;import android.view.View;public class OSM implements IStatusBar { @Override public boolean setStatusBarLightMode (Activity activity, boolean isFontColorDark) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (isFontColorDark) { activity.getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); } else { int uiVisibility = activity.getWindow().getDecorView().getSystemUiVisibility(); activity.getWindow().getDecorView().setSystemUiVisibility(uiVisibility| View.SYSTEM_UI_FLAG_VISIBLE); } return true ; } return false ; } @Override public String getTypeName () { return StatusBarAdapter.OS_M; } }
源代码放到github上了github项目地址 .