如何讓Android 文字(TextView)使用自訂字型不卡頓

有時為了版面好看,或是想要表現出文青的氣息,會想要把App的字型做個統一的樣式呈現,取代掉Android系統內建的字型,於是就會有必須變更字型的需求。而實作的方式只要透過以下幾個步驟就可以完成:

1.先在assets資料夾建立fonts資料夾,並將字型檔複製到assets/fonts的目錄下

2.將文字設定為自訂的字型
private Typeface fontType;
private TextView text;

fontType = Typeface.createFromAsset(getActivity().getAssets(),"fonts/NotoSansCJKtc-Regular.otf");
text.setTypeface(fontType);


基本上到步驟2就已經完成文字使用自訂字型的功能了,但如果使用自訂字型的文字同時出現在ListView或是ViewPager,在滑動的時候就會發生卡頓的情形,所以建議繼續實作步驟3

3.新增靜態提供字型的class,保留產生的字型物件
public class TypeFaceProvider {

   private static Hashtable typeFaces = new Hashtable(3);

   public static Typeface getTypeFace(Context context, String fileName) {

       Typeface typeface = typeFaces.get(fileName);

       if (typeface == null) {

           String fontPath = "fonts/" + fileName;
           typeface = Typeface.createFromAsset(context.getAssets(), fontPath);

           typeFaces.put(fileName, typeface);
       }

       return typeface;
   }

}

然後將Typeface改為使用靜態提供字型的class所產生的物件
private Typeface fontType;
private TextView text;

fontType = TypeFaceProvider.getTypeFace(getActivity(), "NotoSansCJKtc-Regular.otf");
text.setTypeface(fontType);
如此一來就不會每次都一直產生字型的物件而造成卡頓的情形,而且還可以具有加入多組字型的彈性

Reference:
http://stackoverflow.com/questions/15338016/performance-issue-on-custom-font-textview

留言

  1. cannot resolve method getActivity()
    為什麼QQ

    回覆刪除
    回覆
    1. 因為我是以Fragment做為範例,所以當getTypeFace要傳入Context當參數時,是以gatActivity()傳入。
      於是如果在Activity的話,就會出現cannot resolve method getActivity(),
      將getActivity()改為使用this傳入即可。

      刪除

張貼留言

這個網誌中的熱門文章

Mac安裝JDK後仍出現沒有runtime的錯誤 No Java runtime present, requesting install

Android使用Callback做為傳遞資料/通知的方法

如何實作從API抓取資料顯示在列表頁(ListView)上