一个轻量级的 Android 动态换肤库,支持动态加载皮肤包,实现应用主题的实时切换。
- 支持动态加载皮肤包
- 支持多种主题切换(默认、蓝色、红色、绿色等)
- 支持自定义皮肤包
- 支持实时预览
- 支持保存皮肤设置
- 支持 AndroidX
- 支持 Material Design 组件
在项目根目录的 settings.gradle.kts
中添加模块:
include(":skin")
在应用模块的 build.gradle.kts
中添加依赖:
dependencies {
implementation(project(":skin"))
}
在 Application 类中初始化:
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
SkinManager.init(this)
}
}
// 切换皮肤
SkinManager.get().changeSkin(skin)
// 预览皮肤
SkinManager.get().previewSkin(skin)
// 读取已切换的皮肤并更新(第一次启动使用)
SkinManager.get().updateSkin(activity)
- 在项目中创建新的 Android Library 模块,例如
skin-blue
- 在模块的
build.gradle.kts
中添加依赖:
dependencies {
implementation(project(":skin"))
}
在皮肤包模块中创建以下资源文件:
- 颜色资源 (
res/values/colors.xml
):
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#2196F3</color>
<color name="colorPrimaryDark">#1976D2</color>
<color name="colorAccent">#03A9F4</color>
<!-- 添加其他颜色资源 -->
</resources>
- 图片资源:
- 将需要替换的图片资源放在
res/drawable
或res/mipmap
目录下 - 图片资源名称必须与主应用中的资源名称相同
- 在皮肤包模块的
build.gradle.kts
中配置构建类型:
android {
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
- 执行构建命令生成 APK:
./gradlew :skin-blue:assembleRelease
- 皮肤包 APK 将生成在
skin-blue/build/outputs/apk/release/
目录下
- 将生成的 APK 文件复制到应用的 assets 目录或下载到本地存储
- 使用 SkinManager 加载皮肤包:
val skin = Skin(md5 = "", path = "",url = "")
// 应用皮肤
SkinManager.get().changeSkin(skin)
皮肤包是一个独立的 APK 文件,包含以下资源:
- colors.xml:颜色资源
- themes.xml:主题资源
- drawable:图片资源
- 其他自定义资源
- 创建新的 Android Application 模块
- 添加需要的资源文件
- 构建 APK 文件
object SkinConfiguration {
val skinDefault = Skin(
md5 = "",
name = "",
url = ""
)
val skinBlue = Skin(
md5 = "fcdaafb48faeee6e90bcb7c9f5818408",
name = "skin_blue.skin",
url = "skin_blue.apk"
)
val skinGreen = Skin(
md5 = "4d9ee85ca80e7e5614aa0cb661bb738b",
name = "skin_green.skin",
url = "skin_green.apk"
)
val skinRed = Skin(
md5 = "dd8bc7a3ae0a37cd505e50548b878173",
name = "skin_red.skin",
url = "skin_red.apk"
)
}
// 设置默认皮肤
findViewById<MaterialButton>(R.id.btnResetSkin).setOnClickListener {
loadSkin(SkinConfiguration.skinDefault)
}
// 设置蓝色皮肤
findViewById<MaterialButton>(R.id.btnBlueSkin).setOnClickListener {
loadSkin(SkinConfiguration.skinBlue)
}
// 设置红色皮肤
findViewById<MaterialButton>(R.id.btnRedSkin).setOnClickListener {
loadSkin(SkinConfiguration.skinRed)
}
// 设置绿色皮肤
findViewById<MaterialButton>(R.id.btnGreenSkin).setOnClickListener {
loadSkin(SkinConfiguration.skinGreen)
}
库支持以下属性的动态换肤:
- background
- src
- textColor
- textColorHint
- drawableStart/Top/End/Bottom
- backgroundTint
- tint
- buttonTint
- trackTint
- thumbTint
- strokeColor
- rippleColor
- boxStrokeColor
- boxBackgroundColor
- indicatorColor
- trackColor
- cursorColor
- statusBarColor
- navigationBarColor
- 确保在 Application 中初始化 SkinManager
- 皮肤包必须包含完整的资源文件
- 皮肤包的包名必须与应用不同
- 建议在切换皮肤时添加加载动画
- 皮肤包中的资源名称必须与主应用中的资源名称保持一致
Apache License 2.0
欢迎提交 Issue 和 Pull Request