2

我是 android 新手,我想为我的应用程序使用我的自定义字体。我写了两种创建自定义字体的方法。你能告诉我哪一个更好更快。第一种方法是使用单例类第二种方法是创建我自己的文本视图。

单例

public class FontFactory {
    private  static FontFactory instance;
    private HashMap<String, Typeface> fontMap = new HashMap<String, Typeface>();

    private FontFactory() {
    }

    public static FontFactory getInstance() {
        if (instance == null){
            instance = new FontFactory();
        }
        return instance;
    }

    public Typeface getFont(DefaultActivity pActivity,String font) {
        Typeface typeface = fontMap.get(font);
        if (typeface == null) {
            typeface = Typeface.createFromAsset(pActivity.getResources().getAssets(), "fonts/" + font);
            fontMap.put(font, typeface);
        }
        return typeface;
    }
}

有自己的文本视图

public class MyTextView extends TextView {
    public MyTextView(Context context) {
        super(context);
    }

    public MyTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setFonts(context,attrs);
    }

    public MyTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setFonts(context,attrs);
    }

    private void setFonts(Context context, AttributeSet attrs){
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyTextView_customFont);
        String ttfName = a.getString(R.styleable.MyTextView_customFont_ttf_name);

        setCustomTypeFace(context, ttfName);
    }

    public void setCustomTypeFace(Context context, String ttfName) {
        Typeface font = Typeface.createFromAsset(context.getAssets(), "fonts/MuseoSansCyrl_"+ttfName+".otf");
        setTypeface(font);
    }
    @Override
    public void setTypeface(Typeface tf) {

        super.setTypeface(tf);
    }

}
4

1 回答 1

1

在您的自定义 textview 方法中,您每次创建 CustomTextView(或更改其字体)时都会创建 Typeface 对象,而您的工厂会将已加载的对象保留在内存中并重新使用它们。

在某些情况下,使用自定义文本视图的方法可能工作得很好,但如果您突然需要创建很多(或更改其中很多的字体),它可能会显着降低您的性能,就像在这个问题中一样滚动视图

我会选择单身人士。

于 2013-08-06T13:02:07.610 回答