纯色沉浸式状态栏开发,兼容浅色状态栏自适应深色字体
No Data
十分方便的实现纯色沉浸式状态栏的开发,只需要使用代码,不需要在布局额外写任何东西
支持ColorOS系统的沉浸式相关功能
回滚
Android5.0的相关修改,现在基于原生安卓的系统上(如三星的系统,华为的EMUI等),
Android5.0将不能显示深色字体。深度定制的系统不受影响如MIUI,Flyme,ColorOS。如果十分在意这个问题,请不要使用浅色状态栏。
Android5.0以下的状态栏颜色显示状态统一交付给Android底层处理,用来统一处理浅色状态栏字体显示不清的问题,具体影响为
API LEVEL = 21的设备将无法设置你指定的状态栏颜色,因为底层会对你传来的状态栏进行二次处理。具体表现形式为
API LEVEL = 19的设备将显示齿状暗纹,
API LEVEL = 21的设备将整体显示变灰,目前已在原生系统上测试通过,本框架将不会对小于
Android6.0暴力深度定制的第三方rom出现的问题进行适配,只会徒增烦恼而已。
Android4.4显示或者隐藏插入的statusView方法演示
Android4.4中,出现的种种BUG
Android4.4实现沉浸式较为复杂,所以只能使用较为复杂的逻辑来保证不会出现BUG,
Android5.0以上都是非常简单的调用,不用考虑生命周期,也不用考虑调用方法先后顺序。如果有需要单独大于
Android5.0的框架,请在issues中留言,我会酌情考虑。
在gradle中:
compile 'spa.lyh.cn:immersion-sdk:1.0.7'
在maven中:
spa.lyh.cn immersion-sdk 1.0.7 pom
ImmersionMode: 沉浸式状态栏的主体类
ImmersionConfiguration: 沉浸式状态栏的配置类
API LEVEL >= 19以上的系统才可以生效对应效果
API LEVEL >= 23的其他系统才会有对应效果
API LEVEL >= 11但是
API LEVEL < 19,会造成本框架不运行,不会造成程序崩溃
先完成
ImmersionMode和
ImmersionConfiguration的初始化配置
//初始化对应的配置 ImmersionConfiguration configuration = new ImmersionConfiguration .Builder(this) .enableImmersionMode(ImmersionConfiguration.ENABLE) .setColor(R.color.bar_color) .build(); //完成ImmersionMode的配置初始化 ImmersionMode.getInstance().init(configuration);
在activity的
onCreate()生命周期中完成单例,并需要重写
setContentView()方法,在其中完成方法调用
@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); immersionMode = ImmersionMode.getInstance(); }@Override public void setContentView(@LayoutRes int layoutResID) { super.setContentView(layoutResID); immersionMode.execImmersionMode(this); }
}
修改临时配置的方法,一次性的设置不会影响默认的配置,再次加载会重新加载默认设置
//使用资源的colorID赋值 public void changeStatusBarColor(int ResId){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){ ImmersionConfiguration tConfig = new ImmersionConfiguration.Builder(this) .setColor(ResId) .build(); immersionMode.setTemporaryConfig(tConfig); immersionMode.execImmersionMode(this); } } //使用String的Color public void changeStatusBarColor(String color){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){ ImmersionConfiguration tConfig = new ImmersionConfiguration.Builder(this) .setColor(color) .build(); immersionMode.setTemporaryConfig(tConfig); immersionMode.execImmersionMode(this); } }
//启动 public static int ENABLE = 100; //不启动 public static int DISABLE = 101;
ImmersionConfiguration的属性设置方法
enableImmersionMode():是否启动沉浸式状态栏,默认为:
ENABLE
setColor():传入资源id或者String型Color,默认为:
#D0D0D0
沉浸式状态栏的实现思路
API LEVEL >= 19 && API LEVEL < 23:
使用
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);开启沉浸式并在状态栏位置添加一个带有对应颜色的View填充
API LEVEL >= 23:
java Window window = activity.getWindow(); window.setStatusBarColor(color);实现方式为直接修改状态栏颜色,非沉浸式实现
浅色状态栏的实现思路 系统必须为MIUI或者Flyme或者
API LEVEL >= 23的其他系统,这里不展示MIUI与Flyme的实现思路只展示原生的开发思路
//设置为浅色状态栏模式,深色字体 activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); //设置为普通的状态栏模式,浅色字体 activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
深浅色判断逻辑
通过YUV模式,用色彩明亮度,色度,浓度来判断深浅色
java public static boolean isLightRGB(int[] colors){ int grayLevel = (int) (colors[0] * 0.299 + colors[1] * 0.587 + colors[2] * 0.114); if(grayLevel>=192){ return true; } return false; }
因为
API LEVEL >= 19 && API LEVEL < 23时,使用的沉浸式开发,方法
immersionMode.execImmersionMode(this);会在
setContentView()完成以后立刻调用,又因为沉浸式开发,是不可逆的设置,意思就是如果开启沉浸式,除非重新加载
Activity否则无法翻转此状态。所以想要关闭本框架,那么对应方法必须在
setContentView()之前调用,否则在小于
Android5.0上会出现框架依然启动的BUG。
最低
API LEVEL >= 23时,可以无视上述问题,因为
Android6.0以上并没有使用沉浸式开发,所以使用本框架可以不许重写
setContentView()等种种限制运行顺序和生命周期的方式,只要在
onResume()之前任意位置调用即可。
有任何意见和问题,欢迎在issues中提出,一定尽快回复。