Android-skin-support: 一款用心去做的Android 换肤框架, 极低的学习成本, 极好的用户体验.
只需要一行代码, 就可以实现换肤, 你值得拥有!!!
SkinCompatManager.withoutActivity(this).loadSkin();就这么简单, 你的APK已经拥有了强大的换肤功能, 当然现在是拥有了换肤功能, 别忘了制作皮肤包.
demo // 换肤demo 集合
skin-app // demo app
skin-night // 夜间模式皮肤工程
skin-autolayout-app // autolayout demo app
android-support // Android 原生控件
skin-support // 换肤框架, 基础控件支持
skin-support-cardview // 换肤框架, CardView 支持
skin-support-design // 换肤框架, Material Design 支持
skin-support-constraint-layout // 换肤框架, ConstraintLayout 支持
third-part-support // 第三方控件换肤支持
直接添加依赖, 最新版本选择, 请查看更新日志
compile 'skin.support:skin-support:2.1.5' // skin-support 基础控件支持 compile 'skin.support:skin-support-design:1.2.5' // skin-support-design material design 控件支持[可选] compile 'skin.support:skin-support-cardview:1.2.0' // skin-support-cardview CardView 控件支持[可选] compile 'skin.support:skin-support-constraint-layout:1.0.2' // skin-support-constraint-layout ConstraintLayout 控件支持[可选]@OverridepublicvoidonCreate(){super.onCreate(); SkinCompatManager.withoutActivity(this) // 基础控件换肤初始化 .addStrategy(newCustomSDCardLoader()) // 自定义加载策略,指定SDCard路径[可选] .addHookInflater(newSkinHookAutoLayoutViewInflater()) // hongyangAndroid/AndroidAutoLayout[可选] .addInflater(newSkinMaterialViewInflater()) // material design 控件换肤初始化[可选] .addInflater(newSkinConstraintViewInflater()) // ConstraintLayout 控件换肤初始化[可选] .addInflater(newSkinCardViewInflater()) // CardView v7 控件换肤初始化[可选] .addInflater(newSkinCircleImageViewInflater()) // hdodenhof/CircleImageView[可选] .addInflater(newSkinFlycoTabLayoutInflater()) // H07000223/FlycoTabLayout[可选] .setSkinStatusBarColorEnable(false) // 关闭状态栏换肤,默认打开[可选] .setSkinWindowBackgroundEnable(false) // 关闭windowBackground换肤,默认打开[可选] .loadSkin();如果项目中有特殊需求。例如, 股票控件: 控件颜色始终为红色或绿色, 不需要随着模式切换而换肤
那么可以使用类似的方法, 直接设置drawable
setBackgroundDrawable(redDrawable) // 不支持换肤 background="#ce3d3a"而不是使用R.drawable.red
setBackgroundResource(R.drawable.red) background="@drawable/red"// 指定皮肤插件SkinCompatManager.getInstance().loadSkin("new.skin"[, SkinLoaderListener], intstrategy); // 恢复应用默认皮肤SkinCompatManager.getInstance().restoreDefaultTheme();要点:
实现SkinCompatSupportable接口
applySkin方法中实现换肤操作
在构造方法中解析出需要换肤的resId
自定义View可以直接继承自SkinCompatView, SkinCompatLinearLayout等已有控件
eg: CustomTextView
不想继承自已有控件
eg: CustomTextView2
需要换肤自定义属性
// 需要换肤AutoCompleteTextView的R.attr.popupBackground属性
需要使用第三方库控件怎么办
// 需要使用https://github.com/hdodenhof/CircleImageView 控件, 并且要支持换肤
应用内换肤,皮肤名为: night; 新增需要换肤的资源添加后缀 _night。
需要换肤的资源为R.color.windowBackgroundColor, 添加对应资源R.color.windowBackgroundColor_night。
加载应用内皮肤:
SkinCompatManager.getInstance().loadSkin("night", SkinCompatManager.SKIN_LOADER_STRATEGY_BUILD_IN);皮肤工程包名不能和宿主应用包名相同.
例如:
宿主包名: com.ximsfei.skindemo 夜间模式: com.ximsfei.skindemo.night例如 APK中窗口背景颜色为
colors.xml
<colorname="background">#ffffff</color>那么夜间模式你可以在skin-night工程中设置
colors.xml
<colorname="background">#000000</color>将打包生成的apk文件, 重命名为'xxx.skin', 防止apk结尾的文件造成混淆.
加载插件式皮肤, 将皮肤包放到assets/skins目录下
SkinCompatManager.getInstance().loadSkin("night", SkinCompatManager.SKIN_LOADER_STRATEGY_ASSETS);以自定义SDCard加载路径为例:
继承自SkinSDCardLoader,通过getSkinPath方法指定皮肤加载路径,通过getType方法指定加载器type。
publicclassCustomSDCardLoaderextendsSkinSDCardLoader{publicstaticfinalintSKIN_LOADER_STRATEGY_SDCARD = Integer.MAX_VALUE; @OverrideprotectedStringgetSkinPath(Contextcontext, StringskinName){returnnewFile(SkinFileUtils.getSkinDir(context), skinName).getAbsolutePath()} @OverridepublicintgetType(){returnSKIN_LOADER_STRATEGY_SDCARD} }注: 自定义加载器type 值最好从整数最大值开始递减,框架的type值从小数开始递增,以免将来框架升级造成type 值冲突
在Application中,添加自定义加载策略:
SkinCompatManager.withoutActivity(this) .addStrategy(newCustomSDCardLoader()); // 自定义加载策略,指定SDCard路径注: 自定义加载器必须在Application中注册,皮肤切换后,重启应用需要根据当前策略加载皮肤
使用自定义加载器加载皮肤:
SkinCompatManager.getInstance().loadSkin("night.skin", null, CustomSDCardLoader.SKIN_LOADER_STRATEGY_SDCARD);


