23

パーソナライズされたフォント属性を持つカスタム 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"を使用して使用していますが、非常にうまく機能しています。

ArrayAdapter が入力された ListView でこの TextViewPlus を使用しています。

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

私の問題は、ListView をスクロールしているときのパフォーマンスがひどいことです。非常に遅く、ラグがいっぱいです。リストをスクロールするたびに呼び出される TextViewPlus コンストラクター n°2。

通常の TextView で TextViewPlus を変更し、dataText.setTypeface(myFont)を使用すると、すべてがスムーズになり、うまく機能します。

パフォーマンスの問題なしに TextViewPlus を使用するにはどうすればよいですか?

4

1 に答える 1

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;
    }
}
于 2013-03-11T12:05:40.460 に答える