一个通过动态加载外部皮肤包的开源组件
一个使用简单、无侵入性的换肤组件
class YourApplication : Application {
fun onCreate() {
super.onCreate()
SkinManager.getInstance().init(this)
}
}
在皮肤包的module里放置要换肤的同名资源。把编译好的apk包放在sd卡下的特定目录下。
在你需要切换皮肤的地方,调用applySkin方法切换到对应的皮肤包
SkinManager.applySkin("<Your skin apk path>", object : SkinManager.ILoaderListener {
override fun onStart() {
}
override fun onSuccess() {
Toast.makeText(context, "皮肤切换成功", Toast.LENGTH_SHORT).show()
}
override fun onFailed(reason: String?) {
Toast.makeText(context, "皮肤切换失败$reason", Toast.LENGTH_SHORT).show()
}
})
皮肤组件会自动检测所有的xml布局文件中所有支持的换肤的属性,如果属性值是使用的引用资源且皮肤包里也有对应的资源,那么换肤组件会自动切换到皮肤组件里的资源。
相比与xml中的静态资源的引用,实际情况下更多的是使用代码动态的给界面设置资源,那么这种情况下,该如何使用换肤组件呢:
你只需要调用SkinManager的addSkinAttr方法来把activity、view、属性名以及资源id添加到皮肤组件即可。
// SkinManager.addSkinAttr(<actiview>, <View>, <attr name>, <resourceId>)
SkinManager.addSkinAttr(this, view.iv_icon, "src", icon)
- background
View的background属性
- src
ImageView的src属性
- textColor
TextView的TextColor属性
- textSize
TextView的TextSize属性
- drawableLeft、drawableTop、drawableRight、drawableBottom
TextView的drawableXXX相关的属性
- padding、paddingLeft、paddingTop、paddingRight、paddingBottom
View的padding相关属性
- margin、marginLeft、marginTop、marginRight、marginBottom
View LayoutMargin相关的属性
对于目前支持的换肤属性来说可以满足大多数的换肤场景,对于不满足的场景,换肤组件提供了扩展换肤属性的功能。
你只需要扩展SkinElementAttr类,实现apply方法即刻,该方法会在皮肤切换的时候调用,在该方法里调用SkinManager的skinResourceProxy的资源加载方法来加载资源即可。
下面是一个自定义换肤属性的例子:
/**
* ImageView android:src
*/
class ImageSrcAttr : SkinElementAttr() {
override fun apply(view: View?) {
super.apply(view)
(view as? ImageView)?.run {
// 当皮肤变化的时候更新View的src属性
setImageDrawable(SkinManager.skinResourcesProxy.getDrawable(attrValueRefId))
}
}
}
定义好扩展的Attr之后通过SkinManager的registerSkinAttr方法来注册支持的属性:
// 注册ImageView的src换肤属性
SkinManager.registerSkinAttr("src", ImageSrcAttr::class.java)