前言
最近有個換膚的需求牙肝。基于github上的這個開源框架Android-Skin-Loader试溯。這個框架的換膚機(jī)制是使用動態(tài)加載的機(jī)制去加載皮膚包里面的內(nèi)容倔丈,所謂的皮膚包是實(shí)際上是一個apk文件,里面無需任何java代碼扼倘。只要把和需要換膚的apk相同文件名的資源文件添加到res文件夾底下即可确封。(后面會針對怎么制作皮膚包做一個詳解)
本文提供了源代碼的下載,對急于想使用干貨的童鞋很有幫助再菊,只要認(rèn)真看完肯定就能上手爪喘。
對于這個框架的源碼分析暫不做研究,感興趣的童鞋前往此處?Android主題換膚 無縫切換纠拔。同時也感謝作者的資源分享秉剑!
好了,廢話不多bb〕砘澹現(xiàn)在我們開始研究如何使用干貨侦鹏。
1 下載基本的android-skin-loader的文件
百度網(wǎng)盤?提取碼: dbje?
同時也歡迎下載自己的github開源項(xiàng)目,里面包含了換膚等其他效果 臀叙。
2Application繼承SkinBaseApplication
3對需要使用的view添加標(biāo)志
有兩種方式 1)在xml文件中添加 skin:enable="true"
2)那么有的人會有一個疑問略水,如果我的view是動態(tài)添加的呢?別急劝萤,作者也想到了這個需求聚请,我們也可以動態(tài)的添加標(biāo)識。
我們看下這個方法
第一個參數(shù):需要換膚的view稳其、第二個參數(shù):類型名驶赏、第三個參數(shù)是資源文件id
主要是第二個參數(shù):類型名
實(shí)際上這個是可以自定義的,關(guān)于自定義皮膚屬性下面會講既鞠。
4使用換膚功能的activity繼承SkinBaseActivity
當(dāng)然如果是fragment就繼承SkinBaseFragment
5換膚
我們可以看到真正使用的是load方法煤傍,第一個參數(shù)是資源路徑,第二個參數(shù)是回調(diào)嘱蛋。
可以看到這里做的是本地資源保存然后我將他寫入了根目錄下蚯姆。當(dāng)然這里使用線上下載也是同樣的道理,相信不是什么問題洒敏。只是這里為了方便所以用了本地的龄恋,建議換膚前先下載 xxxx.skin文件到手機(jī)外存儲。
好了凶伙,大概的使用就這樣郭毕。
付加:
1此處我們對上文提到的自定義皮膚屬性進(jìn)行研究。
其中我們看到既然有background那么我們是否可以對ImageView設(shè)置前景圖片src呢函荣? ?答案是肯定的显押。
我們模仿他寫了一個SRC=“src".
調(diào)用get的方法
注意條件 AttfFactory.isSuppotesAttr(attrName) 這句話從字面上可以知道是匹配屬性名是否支持提供的幾個皮膚屬性扳肛。如果匹配比如:src則返回SrcAttr。
SrcAttr ?這個類是我們自定義的我們接下去看
自定義皮膚屬性總結(jié):
原理還需要看源碼挖息,上面的幾張圖的代碼是主要所在。
如果只看功能的實(shí)現(xiàn):首先要自定義一個類繼承SkinAttr 如上圖兽肤。接著在AttrFactory的get方法中添加返回。
需要注意的是比如我的imageview設(shè)置src电禀,一定要加上skin:eanble="true"或者動態(tài)添加。理由如下:
如上圖可看出在返回view之前做了一步篩選害驹,如果沒有設(shè)置enable則直接過濾。
2 皮膚文件的制作
皮膚文件實(shí)際上是一個只包含了資源文件不需java代碼的pak文件
1首先創(chuàng)建一個新的project將和需要換膚的原apk中同名的資源文件導(dǎo)入蛤育。比如原apk中有一個需要換膚的textview字體顏色是@color/white 那么新的project一定要存在一個同名的資源文件至于顏色那就根據(jù)實(shí)際重新設(shè)置了宛官。
2導(dǎo)出project的apk文件 改名為xxxx.skin
3將xxxx.skin文件寫入本地作為本地?fù)Q膚或者扔給服務(wù)器讓他們提供一個地址下載到本地作為線上換膚,如果修改文件大的話肯定是建議后者瓦糕。
bug:
目前發(fā)現(xiàn)的bug不多
1: 如果你的應(yīng)用是全屏的底洗,當(dāng)發(fā)現(xiàn)在application初始化換膚設(shè)置(也就是換膚可以實(shí)行的操作)就會發(fā)現(xiàn)出現(xiàn)狀態(tài)而導(dǎo)致無法全屏
解決方法: 代碼研究后發(fā)現(xiàn)在SkinBaseActivity中有個changeStatusColor(),系統(tǒng)默認(rèn)4.4以上都會修改狀態(tài)欄的顏色咕娄。于是把他注釋掉就可以實(shí)現(xiàn)全屏的需求了亥揖。
2:細(xì)心的童鞋其實(shí)還會發(fā)現(xiàn)一個問題,比如我一個ImageView背景是根據(jù)條件的設(shè)置的比如條件1: 背景R.drawable.icon1 ? 條件2:背景是R.drawable.icon2那現(xiàn)在就有一個問題了圣勒。上文提到的皮膚包設(shè)置的資源文件名字必須和原始的一樣费变,那這種情況我要怎么設(shè)置名字呢?
解決方法: 實(shí)際上上文也提過一個動態(tài)添加皮膚view的方式圣贸。凡是類似這種需求的都用動態(tài)添加的方式
dynamicAddSkinEnableView(View view,String attrName, intattrValueResId)
該方法包括了動態(tài)添加修改標(biāo)志以及設(shè)置了設(shè)置了資源挚歧,所以無需重新設(shè)置背景或者顏色。
另外
SkinManager.getInstance.notifySkinUpdate();耗時操作吁峻,記得一定要慎用滑负!