Question Problème de performance sur la police personnalisée TextView


J'ai un TextView personnalisé, avec un attribut de police personnalisé:

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;
    }
}

Je l'utilise dans mes fichiers XML avec l'attribut customFont = "ArialRounded.ttf", et ça marche très bien.

J'utilise ce TextViewPlus dans un ListView, rempli avec un ArrayAdapter.

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

Mon problème est que les performances, lorsque je fais défiler le ListView, sont terribles! Très lent et plein de décalages. Le constructeur TextViewPlus n ° 2, il est appelé tout le temps je fais défiler la liste.

Si je change TextViewPlus dans un TextView normal et que dataText.setTypeface (myFont), tout est bon et fonctionne bien.

Comment puis-je utiliser mon TextViewPlus sans problème de performance?


23
2018-03-11 11:58


origine


Réponses:


Pourquoi ne gardez-vous pas le créé typface objet en mémoire de sorte que vous ne créez pas chaque fois que la vue de texte est créée.

Voici un exemple de classe qui crée et met en cache l'objet de police:

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;
    }
}

37
2018-03-11 12:05