1. 在xml中指定字體。
2. 通過重寫TextView來設置字體。(吃內存怪獸1)
3. 在Activity的初始化階段為每一個TextView設置字體。(吃內存怪獸2)
最近遇到一個需求,需要在程序中應用很多套字體。(中英各三種),所以想尋求一條簡單的方式來實現。
在網上搜索了很久,看起來Android並不支持直接指定FontFamily來設置字體,真坑!!(思路:Root -> 復制字體到system/Fonts文件夾裡,然後再在程序中指定對應的FontFamily)未測試~~囧~~
網上幾個主流的做法是重寫TextView,以此來達到重寫文本的目的。我暫時采用的就是這種方式。(這個方式有個致命缺點,狂占內存)
通過繼承TextView來實現諸如TitleTextView、ContentTextView、RemarkTextView之類的自定義字體控件。為每一個自定義控件指定一種字體。
例如TitleTextView:
public class TitleTextView extends TextView {
public TitleTextView(Context context) {
this(context, null);
}
public TitleTextView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public TitleTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.setTypeface(Typeface.createFromAsset(getResources().getAssets(), "zhongteyuanti.ttc"));
}
}
通過這種方式一個好處是,不需要為每一個TextView指定它的FontFamily,每一個類即有自己的Font屬性。
xml中的用法為:
<com.Yokeqi.Controls.TitleTextView
android:id="@+id/tv_login_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="30dp"
android:text="@string/login_title" />
這個TextView顯示出來即是zhongteyuanti這一種字體了。
----------------- 這一段是總結,不采用這種方式的please跳過 -----------------
對這種方式,感觸比較深的是它吃內存的能力~~!!我一個不指定字體57MB的程序,用這種方式指定字體後居然是440+MB,所以需要優化啦沒得說。
由此衍生出config的想法:Key-Value分別是FontFamily-Typeface。再由一個FontManager來管理這個config(概念),利用單例模式限定每個FontFamily只會拿到同一個Typeface實例,大大降低創建Typeface的內存損耗,哈哈。
我的FontManager中添加了getTypefaceByFontName(Context context, String name)的方法。
public static HashMap<String, Typeface> TypefaceMap = new HashMap<String, Typeface>();
public static Typeface getTypefaceByFontName(Context context,String name){
if (TypefaceMap.containsKey(name)) {
return TypefaceMap.get(name);
} else {
Typeface tf = Typeface.createFromAsset(context.getResources().getAssets(), name);
TypefaceMap.put(name, tf);
return tf;
}
}
TtitleTextView中設置字體的代碼則可以改為:
this.setTypeface(FontManager.getTypefaceByFontname("zhongteyuanti.ttc"));
擴展思路部分:
另外我的config還有語言選項,因為程序需要根據中英兩種語言來取不同的字體的。
最後,config變成了一個xml,存放於Assets中,這樣萬一修改FontFamily對應的字體的時候就簡單多了。
同時key-value變成了FontFamily-FontFileName,FontManager就負責解析這個config來得到FontFamily對應Assets中的字體文件名,然後再獲取Typeface。
================== 最後一種方式 ===================
在Activity的初始化階段來指定字體,因為程序中我不光TextView需要自定義字體,Button、Spinner也需要自定義字體,腫麼辦??!!
我只能想到添加一個initFont()的方法到初始化吧,相關的控件也其實不多,寫多點代碼總比沒辦法實現好~~(你真的有好辦法??)
這個方法也是指定Typeface,所以這個方法也是吃內存怪獸型,一樣要考慮下采用單例模式的思想來獲取Typeface。否則你TMD在逗我。
更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11