2013-03-11 16 views
23

Ho un TextView personalizzato, con un attributo font personale:problema Prestazioni su personalizzato carattere 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; 
    } 
} 

sto usando nei miei file XML con l'attributo customFont = "ArialRounded.ttf", e sta funzionando abbastanza bene.

Sto usando questo TextViewPlus in un ListView, popolato con un ArrayAdapter.

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

Il mio problema è che le prestazioni, quando sto scorrendo il ListView, sono terribili! Molto lento e pieno di ritardi. Il costruttore di TextViewPlus n ° 2 è chiamato tutto il tempo che faccio scorrere l'elenco.

Se cambio TextViewPlus in una normale TextView, e uso dataText.setTypeface (myFont), tutto è smussato e funziona bene.

Come posso utilizzare il mio TextViewPlus senza problemi di prestazioni?

+2

Hai provato caching vostro 'Typeface' da qualche parte, quindi non è sempre creato ogni volta? – jprofitt

+0

Lo faccio adesso. Ho provato la soluzione di Praful Bhatnagar e sta funzionando molto bene – Nifhel

risposta

37

Perché non si tiene l'oggetto typface creato in memoria in modo da non creare ogni volta che viene creata la visualizzazione del testo.

seguito è una classe di esempio che crea e memorizza nella cache l'oggetto carattere:

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

Ora funziona molto meglio! – Nifhel

+0

felice di poter essere d'aiuto .. –

+0

Sono contento che abbia funzionato, ma la memorizzazione nella cache non dovrebbe fornire alcun incremento delle prestazioni nel caso in cui abbiate implementato correttamente l'adattatore ListView. Cioè, le viste (comprese le visualizzazioni testuali) vengono riutilizzate. Se vengono riutilizzati correttamente, nessun file .ttf deve essere caricato più durante lo scorrimento. –