前言
最近项目需要做一键换肤功能,作为移动端(手机app、平板)开发者来说,这是一个常用的功能。实现此功能,先聊聊初始设计方向,一键换肤功能,其实最好是在项目启动时期就有,这样的好处在于,
开发者在设计架构的时候,能够方便的对资源文件进行合理性命名(图片、颜色)。
例如:项目整体色调是绿色,那么标题栏的颜色如果是纯色。我们可能会在color的配置文件中这样写:
<color name="base_bg_green_title">#33CC99</color>
如果项目内有多个绿色纯色按钮,我们可能会这样写:
<color name="base_btn_green">#1FF9D0</color>
如果项目中有不是纯黑色或者纯白色文字,我们可能会这样写:
<color name="base_text_white">#FFFFFa</color>
<color name="btn_text_black">#000004</color>
这样的话,当项目在完结时候,如果要做一键换肤,改动就比较大。你要区分多种资源文件的值。如果是在项目的初期,设定了要做一键换肤。那么在最初的资源命名,我们就会采用如下写法:
<color name="base_bg_whatever_title">#33CC99</color>
<color name="base_btn_whatever">#1FF9D0</color>
<color name="base_text_whatever">#FFFFFa</color>
将基础资源命名为任意。这样便于后期做一键换肤。下文会展开如何快捷的实现此功能。
如何实现:
实现方式有多种,有人会在代码里动态配置if else或者switch语句,通过事件触发去判断加载哪些文件。通过广播或者eventBus去通知更新。这个的好处在于。。。。练手。下面我直接讲解下如何简单使用吧。
目前github上最火的一种换肤方式:Android-skin-support集成
第一步:添加依赖:
implementation 'skin.support:skin-support:3.1.4' // skin-support 基础控件支持 implementation 'skin.support:skin-support-design:3.1.4' // skin-support-design material design 控件支持[可选] implementation 'skin.support:skin-support-cardview:3.1.4' // skin-support-cardview CardView 控件支持[可选] implementation 'skin.support:skin-support-constraint-layout:3.1.4' // skin-support-constraint-layout ConstraintLayout 控件支持[可选]
第二步:在Application的onCreate中初始化 :
@Override public void onCreate() { super.onCreate(); SkinCompatManager.withoutActivity(this) // 基础控件换肤初始化 .addInflater(new SkinMaterialViewInflater()) // material design 控件换肤初始化[可选] .addInflater(new SkinConstraintViewInflater()) // ConstraintLayout 控件换肤初始化[可选] .addInflater(new SkinCardViewInflater()) // CardView v7 控件换肤初始化[可选] .setSkinStatusBarColorEnable(false) // 关闭状态栏换肤,默认打开[可选] .setSkinWindowBackgroundEnable(false) // 关闭windowBackground换肤,默认打开[可选] .loadSkin(); }
第三步: 如果项目中使用的Activity继承自AppCompatActivity,需要重载getDelegate()方法
@NonNull @Override public AppCompatDelegate getDelegate() { return SkinAppCompatDelegateImpl.get(this, this); }
第四步:在项目创建需要换肤的资源文件
默认:
黄肤:
简述:在项目内创建一个res文件,起名如:res-yellow或者res-red或者res-blue。内部的资源文件都以新建的res文件结尾的命名去增加字符。如上图所示。这样在程序启动后可以自动去加载。
第五部:去build.gradle配置引入方式
博主当前是默认皮肤绿色,换肤颜色黄色。
这样就配置进去了。
第六部:点击切换
提供2个方法基础方法:自行编写点击事件
// 恢复默认皮肤 SkinCompatManager.getInstance().restoreDefaultTheme(); // 指定皮肤插件 SkinCompatManager.getInstance().loadSkin("yellow", null, SkinCompatManager.SKIN_LOADER_STRATEGY_BUILD_IN);