Skip to content

纯色沉浸式状态栏开发,兼容浅色状态栏自适应深色字体

Notifications You must be signed in to change notification settings

liyuhaolol/LightImmersionMode

Repository files navigation

重要警示

本项目是本弱鸡早年对沉浸式的一些自我思考和总结代码,后续在工作中发现这个解决方案在应对各种UI需求下,存在很多缺陷,并且没有必要为了沉浸式单独做一个框架,所以早就已经停止了更新。

这个小项目仅能做状态栏的沉浸,并不能做导航栏的沉浸,正因为如此,我舍弃了本项目,自己重新写了一个工具类,其中完整包含了导航栏和状态栏的沉浸适配方案。以及其他诸如AES加密,弹窗,像素,NTP时间校对等综合性的工具框架,并且持续更新中,只要我还是程序员,就会更新这个框架,因为我自己也在用。有兴趣的可以去看一下,链接下面

CommonUtils

LightImmersionMode

十分方便的实现纯色沉浸式状态栏的开发,只需要使用代码,不需要在布局额外写任何东西

效果演示

1.0.7更新

  • 支持ColorOS系统的沉浸式相关功能

  • 回滚Android5.0的相关修改,现在基于原生安卓的系统上(如三星的系统,华为的EMUI等),Android5.0将不能显示深色字体。深度定制的系统不受影响如MIUI,Flyme,ColorOS。如果十分在意这个问题,请不要使用浅色状态栏。

1.0.6更新

  • Android5.0以下的状态栏颜色显示状态统一交付给Android底层处理,用来统一处理浅色状态栏字体显示不清的问题,具体影响为API LEVEL = 21的设备将无法设置你指定的状态栏颜色,因为底层会对你传来的状态栏进行二次处理。具体表现形式为API LEVEL = 19的设备将显示齿状暗纹,API LEVEL = 21的设备将整体显示变灰,目前已在原生系统上测试通过,本框架将不会对小于Android6.0暴力深度定制的第三方rom出现的问题进行适配,只会徒增烦恼而已。

1.0.5更新

  • 优化代码,保存手机型号版本从而使匹配机型报错提示只出现一次

1.0.4更新

  • 修复对MIUI开发版7.7.13以上的支持,就是支持从2017年7月13日以后发布的所有MIUI稳定版和开发版,不更新会造成浅色模式在MIUI上失效。

1.0.3更新

  • 修复对Flyme6.0以上的支持,这个锅是魅族的,他偷偷改了api

1.0.2更新

  • 添加关闭框架的方法演示
  • 添加Android4.4显示或者隐藏插入的statusView方法演示
  • 删除了TemporaryConfig类,使用ImmersionConfiguration来完成
  • 大幅度修改框架运行逻辑,避免在Android4.4中,出现的种种BUG
  • Android4.4实现沉浸式较为复杂,所以只能使用较为复杂的逻辑来保证不会出现BUG,Android5.0以上都是非常简单的调用,不用考虑生命周期,也不用考虑调用方法先后顺序。如果有需要单独大于Android5.0的框架,请在issues中留言,我会酌情考虑。

引用方法

  • 在gradle中:
    compile 'spa.lyh.cn:immersion-sdk:1.0.7'
  • 在maven中:
<dependency>
	<groupId>spa.lyh.cn</groupId>
	<artifactId>immersion-sdk</artifactId>
	<version>1.0.7</version>
	<type>pom</type>
</dependency>

主要的类介绍

  • ImmersionMode : 沉浸式状态栏的主体类
  • ImmersionConfiguration : 沉浸式状态栏的配置类

使用方式

  • 本框架沉浸式效果仅支持API LEVEL >= 19以上的系统才可以生效对应效果
  • 本框架浅色状态栏,自适应字体仅支持MIUI或者Flyme系统,或者API LEVEL >= 23的其他系统才会有对应效果
  • 本框架支持最低API LEVEL >= 11但是API LEVEL < 19,会造成本框架不运行,不会造成程序崩溃

先完成ImmersionModeImmersionConfiguration的初始化配置

//初始化对应的配置
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);
        }
    }

Config的所有属性介绍

//启动
public static int ENABLE = 100;
//不启动
public static int DISABLE = 101;
  • ImmersionConfiguration的属性设置方法

    enableImmersionMode():是否启动沉浸式状态栏,默认为:启用

    setColor():传入资源id或者String型Color,默认为:#D0D0D0

框架的完成思路

  • 沉浸式状态栏的实现思路

    API LEVEL >= 19 && API LEVEL < 23:

    使用window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);开启沉浸式并在状态栏位置添加一个带有对应颜色的View填充

    API LEVEL >= 23:

    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模式,用色彩明亮度,色度,浓度来判断深浅色

    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中提出,一定尽快回复。

About

纯色沉浸式状态栏开发,兼容浅色状态栏自适应深色字体

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages