【发布时间】:2014-07-23 01:56:30
【问题描述】:
我有一个自定义的View,我正在其中绘制一些文本。我正在使用 assets 文件夹中提供的各种免费 otf/ttf 字体文件
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()));
}
说实话,我不知道是什么原因造成的,也不知道如何预防。任何帮助表示赞赏!
【问题讨论】:
-
您能告诉我们您使用的是哪些字体吗?尤其是那些引起问题的可能很重要。
-
这在我使用的所有字体上随机发生。 ttf 文件来自 Google 字体。
-
您能否发布一个链接,指向您遇到问题的至少一种字体?我想尝试重现问题。
-
我建议您将字体作为静态变量或其他东西保存,并且只加载一次。
标签: android fonts android-custom-view text-rendering android-typeface