這是一個(gè)Android換膚的庫(kù),代碼量極少,支持換膚的情況還比較多,提供了以下功能:
- 無(wú)需重啟,一鍵換膚效率高
- 支持App內(nèi)多套皮膚換膚
- 支持插件式動(dòng)態(tài)換膚
- 支持Activity,F(xiàn)ragment,以及使用LayoutInflater創(chuàng)建的View換膚
- 支持手動(dòng)創(chuàng)建的View換膚
- 支持RecyclerView換膚
- 支持自定義View換膚
才寫(xiě)好不久,要是有什么問(wèn)題或建議希望不吝賜教,提issues或者這里評(píng)論都可以~要是有幫助希望star一下~
使用
依賴(lài)
1、在根目錄的build.gradle中加入如下配置
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
2、在要是用的module中增加如下引用
dependencies {
...
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.github.arvinljw:ChangeSkinHelper:v1.0.2'
}
資源定義
換膚,就像字面意思換的大多無(wú)非就是顏色,顏色里又可以包含文字背景顏色和不同顏色圖片資源,當(dāng)然除此之外還可以換字體等。本庫(kù)支持的資源類(lèi)型包含:
- color
- drawable和mipmap
- string
其中字體資源目前只能放在assets目錄中,路徑需要在string中定義下文中詳細(xì)介紹。
其實(shí)app內(nèi)和插件皮膚包中的資源定義方式都是一致的,只是位置不一樣,插件皮膚包需要先加載,app內(nèi)的可以直接使用而已。
本庫(kù),定義不同皮膚的標(biāo)準(zhǔn)是通過(guò)后綴,例如默認(rèn)顏色資源colorAccent,皮膚顏色資源就需要使用原資源名字加后綴,以后綴_light為例,light皮膚就是colorAccent_light,也就是資源名字對(duì)應(yīng)為:
-
color資源
默認(rèn):
colorAccentlight皮膚:
colorAccent_light -
drawable資源
默認(rèn):
img_avatarlight皮膚:
img_avatar_light -
string資源
默認(rèn):
custom_typefacelight皮膚:
custom_typeface_light
其中字體的設(shè)置比較特殊,建議在app的style中加入csh_typeface屬性進(jìn)行全局設(shè)置:
<item name="csh_typeface">@string/custom_typeface</item>
這里的custom_typeface資源就是指字體在assets目錄中的路徑,沒(méi)有填寫(xiě)目錄時(shí)表示使用默認(rèn)字體。
皮膚資源的定義:在默認(rèn)資源后加后綴定義某類(lèi)皮膚,例如各類(lèi)xml寫(xiě)的drawable也是一樣,當(dāng)然xml里邊寫(xiě)的資源就需要自己手動(dòng)換了。
需要注意的是,如果皮膚里沒(méi)有找到對(duì)應(yīng)資源就會(huì)使用默認(rèn)資源
換膚
資源的定義都完成了,那么換膚的工作就基本完成了百分之99。剩下的功能就是簡(jiǎn)單的三步:
- 在需要換膚的Activity繼承
ChangeSkinActivity, - 重寫(xiě)
isChangeSkin方法并返回true即可,默認(rèn)是不開(kāi)啟換膚的 - 需要換膚時(shí),調(diào)用父類(lèi)的
dynamicSkin方法
dynamicSkin該方法有兩個(gè)重載方法:
-
protected void dynamicSkin(String skinSuffix)該方法是換app內(nèi)的皮膚的,傳入皮膚后綴就可以了。 -
protected void dynamicSkin(String skinPath, String skinSuffix)該方法是插件式動(dòng)態(tài)換膚,第一個(gè)參數(shù)就是皮膚包的具體路徑,第二個(gè)就是皮膚后綴。
當(dāng)然還原成默認(rèn)皮膚可以直接調(diào)用defaultSkin方法就能實(shí)現(xiàn)默認(rèn)皮換替換。
換膚:dynamicSkin
還原:defaultSkin
補(bǔ)充說(shuō)明:
View只要是通過(guò)LayoutInflater.from(context).inflate()來(lái)創(chuàng)建的,其中context是繼承自ChangeSkinActivity的activity,當(dāng)然這些view的文字背景或者圖片資源是通過(guò)引用資源的方式設(shè)置的,那么就可以實(shí)現(xiàn)換膚。
這樣的情況包括Fragment,或者通過(guò)inflate引用布局文件創(chuàng)建View。
其實(shí)RecyclerView這類(lèi)的也可以,但是滑動(dòng)一下就會(huì)發(fā)現(xiàn)不對(duì)勁,這是因?yàn)樗嬖趇tem復(fù)用,所以需要優(yōu)化處理,后文中會(huì)介紹如何處理。
狀態(tài)欄、導(dǎo)航欄、ActionBar顏色設(shè)置
這部分就比較簡(jiǎn)單,狀態(tài)欄的顏色設(shè)置主要是通過(guò)laobie/StatusBarUtil設(shè)置的,主要是顏色獲取通過(guò)ChangeSkinHelper.getColor,導(dǎo)航欄只支持5.0以后,actionBar主要就是獲取到actionBar設(shè)置顏色即可,不使用actionBar不管也行,具體代碼:
private void setBarsColor() {
StatusBarUtil.setColorNoTranslucent(this, ChangeSkinHelper.getColor(R.color.colorPrimary));
ChangeSkinHelper.setNavigation(this, R.color.colorPrimary);
ChangeSkinHelper.setActionBar(this, R.color.colorPrimary);
}
這個(gè)方法需要在activity的onCreate方法中調(diào)用和在換膚的回調(diào)changeSkin方法中調(diào)用即可,使用方法見(jiàn)app下的MainActivity。
插件皮膚包
插件皮膚包其實(shí)就是一個(gè)Android apk,只是里邊可以只包含資源文件即可。
皮膚包只需要?jiǎng)?chuàng)建好項(xiàng)目,加入對(duì)應(yīng)的資源,然后build成apk,存放到手機(jī)目錄中即可。
可以注意的點(diǎn)就是皮膚包最好不加任何第三方依賴(lài)包括google的support包這樣會(huì)讓皮膚包小很多。
手動(dòng)創(chuàng)建View換膚
RecyclerView換膚
自定義View換膚
感謝
換膚功能最開(kāi)始是通過(guò)《網(wǎng)易云課程-安卓高級(jí)開(kāi)發(fā)工程師微專(zhuān)業(yè)》學(xué)習(xí),后來(lái)又看到了hongyangAndroid/ChangeSkin庫(kù),吸取了一些技巧,對(duì)我?guī)椭己艽螅诖吮硎咎貏e感謝~
如果有任何對(duì)本庫(kù)需要改進(jìn)和優(yōu)化的建議都可以通過(guò)issues提交給我,我會(huì)定期維護(hù)優(yōu)化,感謝支持。