原來(lái)Android換膚如此簡(jiǎn)單

這是一個(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):colorAccent

    light皮膚:colorAccent_light

  • drawable資源

    默認(rèn):img_avatar

    light皮膚:img_avatar_light

  • string資源

    默認(rèn):custom_typeface

    light皮膚: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)化,感謝支持。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容