Android自定义字体
在最近的工作中遇到了設置自定義字體的問題,經過在網上查詢相關資料和看源碼最終將自定義字體弄明白了,因此寫下此博客記錄一下,希望能給其他人一些幫助。
對比ios系統,Android中默認的字體在中文顯示上是十分難看的,尤其是字號比較大的時候,默認字體樣式都會感覺比較粗,所以一般對于產品有追求的設計,都會考慮換一套字體樣式。在應用中需要配置不同的字體,而 Android 只能在 xml 中配置系統默認提供的四種字體,需要自定義的字體都需要在 Java 代碼中配置
為什么自定義字體
Android系統默認使用的是一款叫Roboto的字體。如果你想要突出一個元素,那么會有很多的選擇:顏色,大小,樣式(粗體,斜體,普通),另一種方式就是使用不同于系統的字體來裝飾你的view。
最快的使用自定義字體的方法
首先我們需要在網上找到自己要設置的字體文件 xxx.ttf 比較好的地方有1001 Free Fonts或者是Google Fonts。
然后把下載下來的xxx.ttf文件放到工程的asset/fonts路徑下面,如果工程中沒有這個路徑可以自己建一個這樣的路徑 建立的方法如圖所示
建立路徑成功之后將xxx.ttf 文件放在該目錄下面 如下圖所示
最后就是將這個字體運用到你想要改變的 TextView 上面。
TextView textView = (TextView)findViewById(R.id.qy_w_subject_tv); Typeface mCustomFont = Typeface.createFromAsset(getAssets(), "fonts/impact_custom.ttf"); textView.setTypeface(mCustomFont);這樣就結束了,如果想要改變一個Textview的字體就是這么簡單,最好的情況就是上面的代碼在 onCreate() 方法中進行調用。
在我的工程中就兩處用到了自定字體,所以我就用了上面的方法去實現,如果很多地方都需要改變字體可以用下面的方法,下面的方法是從別人的文章中粘貼過來的 僅供參考
提供字體內存緩存
雖然Android現在已經很流暢,但是我們依然應該考慮優化性能。所以,我們應該把自定義的字體緩存起來,這樣就不用每次去初始化 方法如下
public class FontCache {private static Hashtable<String, Typeface> fontCache = new Hashtable<String, Typeface>();public static Typeface get(String name, Context context) {Typeface tf = fontCache.get(name);if(tf == null) {try {tf = Typeface.createFromAsset(context.getAssets(), name);}catch (Exception e) {return null;}fontCache.put(name, tf);}return tf;} }緩存下字體就能讓我們不用一直去操作 Assets 文件夾,接下來就能實現一個繼承自 TextView 的類。
也就是所謂的自定義View
繼承TextView
public class EatFoodyTextView extends TextView {public EatFoodyTextView(Context context) {super(context);applyCustomFont(context);}public EatFoodyTextView(Context context, AttributeSet attrs) {super(context, attrs);applyCustomFont(context);}public EatFoodyTextView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);applyCustomFont(context);}private void applyCustomFont(Context context) {Typeface customFont = FontCache.getTypeface("SourceSansPro-Regular.ttf", context);setTypeface(customFont);} }開始的三個都是構造函數,里面都調用了 applyCustomFont() 方法,然后從上面的 FontCache 類中拿到緩存的字體文件,這樣就不用每個view都去重復的從 Assets中取字體,節約了資源,最后將取到的字體設置到 setTypeface() 中。
使用自定義類
現在我們只需要在XML中直接使用,不需要再寫其他的java代碼,
<RelativeLayout android:layout_width="match_parent"android:layout_height="match_parent"><com.futurestudio.foody.views.EatFoodyTextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="@color/eat_foody_green_dark"android:textSize="20sp"android:text="Future Studio Blog"android:layout_marginBottom="24dp"/></RelativeLayout>我們可以依然使用TextView的其他屬性,(textSize,textColor之類的),只需要把 TextView替換成 com.futurestudio.foody.views.EatFoodyTextView,這個前面的是全部的包名,然后就會自己應用字體。
但是使用中會發現,雖然一些TextView的屬性比如 textSize 能正常的顯示,但是 textStyle 這個屬性并不能正常的生效。
復雜一點的操作
添加每個ttf文件
首先將同一個系列的三種樣式的 ttf 文件都加到 assets 中
在XML中使用textStyle屬性
在前面已經講解了自定義view的使用
實現CustomFontTextView
為了能繼續的使用系統的 android:textStyle 屬性,需要一些步驟。
首先需要在代碼拿到這個屬性的信息,這只需要一行代碼:
attr 這個值是來自 TextView 第二個構造函數中參數,我們可以使用這個對象的 getAttributeIntValue() 方法獲取XML的屬性。
先看一下上面代碼中的 ANDROID_SCHEMA 這個參數,這個是一個常量,定義在XML的最頂部中(xmlns:android=”http://schemas.android.com/apk/res/android” ),第二個參數就是定義的屬性名,最后一個參數是默認值,如果這個屬性沒有設置,那么就會選擇 Typeface.NORMAL。
當我們考慮了樣式之后,完善一下代碼,全部的代碼看起來就像下面這樣
這樣我們的自定義字體就能使用標準的應用字體樣式 textStyle。
看看成果
首先我們在XML中寫一些布局,包括原生的 Roboto 字體以及不同形式的自定義字體。
setTypeface(Typeface tf)源碼
參考文章:
http://www.jianshu.com/p/38f475fc07ad
http://www.jianshu.com/p/6778d048d8c6
https://developer.android.com/reference/android/graphics/Typeface.html#createFromAsset(android.content.res.AssetManager, java.lang.String)
總結
以上是生活随笔為你收集整理的Android自定义字体的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端学习(2258)如何做标签管理
- 下一篇: 前端学习(2447):数据筛选处理