我有一个自定义的View
,在其中绘制一些文本。我使用各种免费的otf/ttf字体文件,这些文件都在assets文件夹中。
public class ProjectView extends View {
private final Paint textPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
private void init(Context context) {
textPaint.setStyle(Paint.Style.FILL);
textPaint.setAntiAlias(true);
typeface = Typeface.createFromAsset(context.getAssets(), "fonts" + File.separator + fontFileName);
textPaint.setTypeface(typeface);
}
}
除了一个问题,一切似乎都正常:我绘制的字会随机混乱,也就是说字母会被随机替换成其他字母或符号。
以下是示例:
正确的单词在左图中,但有时会像右图那样绘制。再次调用
invalidate()
使所有内容正确呈现,可以解决这个问题。这种效果在
ListView
中更为明显,因为我在每次项点击时调用notifyDatasetChanged()
导致重绘更加频繁。在适配器中,我使用如下方式:@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
ViewHolder holder;
if (convertView == null) {
view = inflater.inflate(R.layout.list_item_fonts, null);
holder = new ViewHolder();
holder.txtFont = (TextView) view.findViewById(R.id.txtFont);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
//tried this two but no success
holder.txtFont.setPaintFlags(holder.txtFont.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG | Paint.DEV_KERN_TEXT_FLAG);
holder.txtFont.getPaint().setSubpixelText(true);
holder.txtFont.setTextSize(TypedValue.COMPLEX_UNIT_SP, fonts.get(position).getSize());
holder.txtFont.setTypeface(Typeface.createFromAsset(context.getAssets(), "fonts" + File.separator + font.getFileName()));
}
说实话,我不知道是什么原因导致了这个问题,也不知道该如何防止它。如果有帮助,请提供!