A framework for Android app dynamic skins
SDK版本要求和注意事项: 安卓21及以上,Kotlin1.4及以上版本(项目中如果不存在Kotlin可以不用关注)。
repositories {
mavenCentral()
}
dependencies {
implementation "io.github.rangerleoio:skin-lite:1.0.0" //请使用最新版本
}
# RangerSkin
-keep class com.rangerleo.skin.** { *; }
SkinManager.init(application)
SkinResources.init(application)
使用SkinManager使用app将拥有全量自动换肤功能(同时SkinResources会在内部进行初始化),使用SkinResources仅用于户资源获取。 设计两个初始化的目的是方便开发者进行性能测试或功能调试,开发者可以根据需要二选一即可。SDK初始化操作仅仅为传递application对象对App 启动耗时无任何影响。
//加载皮肤包并立即生效
SkinManager.instance?.applySkinStyle(skinPath)
//重置为默认样式
SkinManager.instance?.resetSkinStyle()
updateSkinStyle方法第一次加载为耗时操作,建议放在子线程中执行
background | src | textColor | textSize |
---|---|---|---|
text | hint | textColorHint | textCursorDrawable |
tint | foregroundTint | backgroundTint | style和?attr |
如果在xml中布局中上述列表定义的属性能满足换肤,需要则接下来制作皮肤包即可,无代码修改。参考demo中activity_main.xml
中switch_btn
或者reset_btn
即可。
另外textCursorDrawable属性在lite版本中仅支持android 10及以上。
-
在xml布局中声明的自定义布局(参考demo中activity_main.xml
demo_view
) -
在代码中动态添加的view对象(参考demo中MainActivity.kt
addTextView
方法) -
dialog和popupWindow(参考demo中MainActivity.kt的
dialog
和popupWindow
) -
fragment适配规则和activity一致,总之通过XML属性声明+View#addOnSkinChangeListener适配的方式可以满足几乎所有场景。
制造皮肤包的规则参考res-demo中,所有需要变更的样式的名称保持不变,修改样式内容即可。
参考build.gradle Demo工程下gradle.properties
#皮肤工程开关
isSkinPackage=true
设置为true运行,执行app的assembleReslease或者assembleDebug会在build生成皮肤包。皮肤包的后缀以.skin结尾。 Demo中把demo.skin放在/data/data/com.rangerleo.skin.demo/cache目录下即可查看换肤效果
作者主页:https://juejin.cn/user/1864393707749687
RangerSkin is licensed under the Apache License 2.0: LICENSE.