0

有什么方法可以加快我的应用程序中字体的更改速度?

我有一个ListView从在线 XML 加载它的列表。一切都很好,但我需要从我的资产文件夹中将其字体更改为自定义字体。

当我申请时:

 TxEventName = (TextView)row.findViewById(id.eventNameTx);
 TxEventName.setText(getEventsCount(position));
 TxEventName.setTypeface(Utilities.textFont(this.getContext()));

它变得很慢,因为我应用了setTypeface.

有时它会先加载 UI 布局然后加载列表,有时它只是一个延迟的黑屏,然后当下一个活动出现时,列表已经存在。

我什AsyncTask至用来加载列表的值,类似于:

private class initList extends AsyncTask<Void, Void, Void>{

    @Override
    protected Void doInBackground(Void... params) {

        SimpleDateFormat formatterc; 
        Date xdatec=null; 
        formatterc = new SimpleDateFormat("dd/MM/yy");
        try {
            xdatec = (Date)formatterc.parse(date);
            SimpleDateFormat frmtr = new SimpleDateFormat(dateTemplateForChecking);
            selectedDate = frmtr.format(xdatec).toString();
        } catch (ParseException e) {
            e.printStackTrace();
        }

        for(int i = 0; i < XMLParser.ppEvents.size(); i++) {
            EventsObj evObj = XMLParser.ppEvents.get(i);

            for(int j = 0; j < evObj.date.size(); j++) {
                if(selectedDate.equalsIgnoreCase(evObj.date.get(j))) {

                    StringBuilder sbldr = new StringBuilder();
                    sbldr.append(evObj.act_id);
                    sbldr.append("!");
                    if (SelectLanguage.lang == "ENG"){
                    sbldr.append(evObj.name_en);
                    } else if (SelectLanguage.lang == "TCH"){
                        sbldr.append(evObj.name_tc);
                    } else if (SelectLanguage.lang == "SCH"){
                        sbldr.append(evObj.name_sc);
                    }

                    mainEvents.add(sbldr.toString());
                    eventID.add(Integer.toString(evObj.act_id));
                }   
            }
        }
        adapter = new events_adapter(PublicProg.this, layout.events_adapter, id.eventNameTx, mainEvents);
        return null;
    }

    protected void onPostExecute(Void result){
        eventList.setAdapter(adapter);
    }

    protected void onPreExecute(){
        Bundle ext = getIntent().getExtras();

        position = ext.getString("position");
        date = ext.getString("date");

        mainEvents = new ArrayList<String>();
        eventID = new ArrayList<String>();
    }
}
4

3 回答 3

1

我用它来创建简单的缓存Typeface

public class Typefaces{

private static final Hashtable<String, Typeface> cache = new Hashtable<String, Typeface>();

    public static Typeface get(Context c, String name){
        synchronized(cache){
            if(!cache.containsKey(name)){
                Typeface t = Typeface.createFromAsset(
                        c.getAssets(), 
                        String.format("fonts/%s.OTF", name)
                    );
                cache.put(name, t);
            }
            return cache.get(name);
        }
    }

}

在适配器构造函数中初始化您的自定义Typeface

myriadBold = Typefaces.get(mContext, "MYRIADPRO-BOLD");

并将其用于getView

txt.setTypeface(myriadBold);

这样可以减少skia生成自定义字体的数字系统调用。

于 2012-08-16T16:17:01.813 回答
0

也许你设置字体的地方不是好地方。

还有 Utilities.textFont(this.getContext()),这样您可能正在从文件系统中读取字体,这可能会减慢您的进程,并且根据调用此行的位置,您正在锁定 UI。

于 2012-08-16T16:01:35.817 回答
0

您可以Typeface通过自定义设置TextView

public class TextViewGeorgiaBold extends TextView {

Resources res = getResources();
String font_path = res.getString(R.string.MAIN_FONT);

public TextViewGeorgiaBold(Context context, AttributeSet attrs, int defStyle) {
    super(context.getApplicationContext(), attrs, defStyle);
    Typeface font = Typeface.createFromAsset(getContext()
            .getApplicationContext().getAssets(), font_path);
    setTypeface(font);
}

public TextViewGeorgiaBold(Context context, AttributeSet attrs) {
    super(context.getApplicationContext(), attrs);
    Typeface font = Typeface.createFromAsset(getContext()
            .getApplicationContext().getAssets(), font_path);
    setTypeface(font);

}

public TextViewGeorgiaBold(Context context) {
    super(context.getApplicationContext());
    Typeface font = Typeface.createFromAsset(getContext()
            .getApplicationContext().getAssets(), font_path);
    setTypeface(font);
}

}

as 它设置TypeFace布局膨胀的时间。

也许它会帮助你。

于 2012-08-16T16:14:01.840 回答