前言
??上一章講了 Fragment 以及系統(tǒng)狀態(tài)欄、系統(tǒng)底部虛擬按鍵的換膚,這一章我們來完成自定義 View 的換膚以及字體換膚(字體樣式)。
字體樣式換膚
??如何進(jìn)行更換字體樣式呢?首先,一般我們的字體樣式都是放在 assets 目錄下的,然后通過 Typeface.createFromAsset();方法返回一個(gè) Typeface,然后 TextView 有一個(gè)方法,setTypeface() 就可以設(shè)置字體的樣式了。
??首先我們在換膚框架里面加上下面代碼

image.png

image.png
??在 SkinResources 中添加如下代碼:
public Typeface getTypeface(int resId){
String skinTypeface = getString(resId);
if(TextUtils.isEmpty(skinTypeface)){
return Typeface.DEFAULT;
}
Typeface typeface;
if(isDefaultSkin){
typeface = Typeface.createFromAsset(mAppResources.getAssets(),skinTypeface);
}else{
typeface = Typeface.createFromAsset(mSkinResources.getAssets(),skinTypeface);
}
return typeface;
}
??在 SkinThemeUtil 中添加如下代碼
private static int[] TYPEFACE_ATTR = {
R.attr.skinTypeface
};
/**
* 獲取更換字體的 Typeface
*/
public static Typeface getSkinTypeface(Activity activity){
int[] resId = getResId(activity, TYPEFACE_ATTR);
return SkinResources.getInstance().getTypeface(resId[0]);
}
??然后我們在換膚的時(shí)候需要調(diào)用一下該方法,并修改其他代碼

image.png
??需要注意一下,字體的換膚一般都是全局性的字體換膚,所以我們在篩選 View 的時(shí)候要放寬一下條件

image.png

image.png

image.png
??這樣就能完成字體樣式換膚了
??為了能夠看清楚字體,我將 MainActivity 布局中某些控件的顏色改了一下。

換膚前

換膚后
自定義 View
??隨便寫一個(gè)自定義 View,放到 MainActivity 的布局里面。

image.png
??如圖,我放另一個(gè)圓在上面,然后顏色設(shè)置成了 @color/black,按理說應(yīng)該和還原按鈕的背景顏色一樣,換成一樣的顏色,但是...

image.png
??原因很簡單,就是因?yàn)槲覀儫o法知道用戶自定義 View 中自定義屬性的名字到底是什么,我們無法篩選出需要換膚的自定義 View。
??那么我們就提供一個(gè)接口,SkinViewSupport
/**
* 解決自定義 View 換膚的問題
*/
public interface SkinViewSupport {
void applySkin();
}
??然后,如果你的自定義 View 想換膚,就必須實(shí)現(xiàn)我這個(gè)接口,并且重寫換膚的方法,具體怎么換膚,由使用者自己來寫。
??然后修改 SkinAttribute 中的代碼

image.png

image.png

換膚前

換膚后
最后整理

思維導(dǎo)圖