2013-03-11 3 views
23

У меня есть пользовательский TextView, с персонализированным атрибутом шрифта:вопрос об исполнении пользовательских шрифтов TextView

public class TextViewPlus extends TextView { 
    private static final String TAG = "TextViewPlus"; 
    public TextViewPlus(Context context) { 
     super(context); 
    } 
    public TextViewPlus(Context context, AttributeSet attrs) { 
     // This is called all the time I scroll my ListView 
     // and it make it very slow. 
     super(context, attrs); 
     setCustomFont(context, attrs); 
    } 
    public TextViewPlus(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     setCustomFont(context, attrs); 
    } 
    private void setCustomFont(Context ctx, AttributeSet attrs) { 
     TypedArray a = ctx.obtainStyledAttributes(attrs, R.styleable.TextViewPlus); 
     String customFont = a.getString(R.styleable.TextViewPlus_customFont); 
     setCustomFont(ctx, customFont); 
     a.recycle(); 
    } 
    public boolean setCustomFont(Context ctx, String asset) { 
     Typeface tf = null; 
     try { 
      tf = Typeface.createFromAsset(ctx.getAssets(), asset); 
      setTypeface(tf); 
     } catch (Exception e) { 
      Log.e(TAG, "Could not get typeface: "+e.getMessage()); 
      return false; 
     } 
     return true; 
    } 
} 

Я использую его в моих файлах XML с атрибутом customFont = «ArialRounded.ttf», и он работает достаточно хорошо.

Я использую этот TextViewPlus в ListView, заполненный ArrayAdapter.

TextViewPlus dataText = (TextViewPlus) itemView.findViewById(R.id.data_text); 
dataText.setText("My data String"); 

Моя проблема в том, что производительность, когда я прокручиваю ListView, ужасна! Очень медленный и полный лагов. Конструктор TextViewPlus n ° 2 он называется все время, когда я просматриваю список.

Если я изменяю TextViewPlus в обычном TextView и использую dataText.setTypeface (myFont), все будет хорошо и работает хорошо.

Как я могу использовать свой TextViewPlus без проблем с производительностью?

+2

вы пробовали кэширование вашего 'Typeface' где-то, так что не получает создан каждый раз? – jprofitt

+0

Я сейчас. Я пробовал решение Praful Bhatnagar, и он работает очень хорошо. – Nifhel

ответ

37

Почему бы вам не сохранить созданный объект typface в памяти, чтобы вы не создавали каждый раз, когда создается текстовое представление.

Ниже приведен класс образца, который создает и кэшировать объект начертания:

public class TypeFaceProvider { 

    public static final String TYPEFACE_FOLDER = "fonts"; 
    public static final String TYPEFACE_EXTENSION = ".ttf"; 

    private static Hashtable<String, Typeface> sTypeFaces = new Hashtable<String, Typeface>(
     4); 

    public static Typeface getTypeFace(Context context, String fileName) { 
    Typeface tempTypeface = sTypeFaces.get(fileName); 

    if (tempTypeface == null) { 
     String fontPath = new StringBuilder(TYPEFACE_FOLDER).append('/').append(fileName).append(TYPEFACE_EXTENSION).toString(); 
     tempTypeface = Typeface.createFromAsset(context.getAssets(), fontPath); 
     sTypeFaces.put(fileName, tempTypeface); 
    } 

    return tempTypeface; 
    } 
} 
+1

Теперь он работает намного лучше! – Nifhel

+0

рад, что я мог бы помочь. –

+0

Я рад, что это сработало, но кеширование не должно давать вам никакого повышения производительности, если вы внедрили свой адаптер ListView правильно. То есть, взгляды (включая текст) повторно используются. Если они правильно используются, тогда во время прокрутки больше не нужно загружать файл .ttf. –

Смежные вопросы