有什么方法可以加快我应用中字体的更改速度?
我有一个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>();
}
}
答案 0 :(得分: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
以生成用户字体。
答案 1 :(得分:0)
也许你在哪里设置字体不是好地方。
还有Utilities.textFont(this.getContext()),你可能正在阅读文件系统中的字体,这可能会减慢你的进程,并且根据调用这一行的位置,你正在锁定UI。
答案 2 :(得分: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);
}
}
因为它在布局膨胀时设置了TypeFace
。
可能会帮助你。