Android 中的自定义字体在不同 API 中的呈现方式不同
Posted
技术标签:
【中文标题】Android 中的自定义字体在不同 API 中的呈现方式不同【英文标题】:Custom Font in Android renders differently in different APIs 【发布时间】:2012-06-12 18:02:47 【问题描述】:我在我的 android 应用程序中使用自定义 .ttf 字体。我以通常的方式加载它:
myTypeface = Typeface.createFromAsset( getAssets(), "myTypeface.ttf");
然后我在我的活动中分配我的字体......非常简单的东西:
TextView tv = (TextView) findViewById(R.id.sample_text);
tv.setTextSize(12);
tv.setTypeface(App.myTypeface);
我遇到的问题是,在某些使用更高版本 API 的设备上(我在 Asus Transformer 的模拟器中特别注意到它),文本看起来稍微粗一些,宽度不太均匀,垂直方向更混乱结盟。在最后一部分,我的意思是某些字符在垂直方向上的位置比其他字符稍高或稍低,给文本带来一点过山车的感觉。
考虑下面的屏幕截图
这是在模拟器上呈现的文本,其分辨率和 dpi 与 Transformer 相同,但使用的是 Google API 级别 8。
看起来很标准,对吧?
现在考虑在具有相同分辨率和 dpi 但使用 Google API 级别 15 的模拟器中呈现的文本:
起初,文本可能看起来很相似,但您可能会注意到它看起来有点粗体。但是,请看“quick”中的“c”。你会注意到它比第一个渲染中的“c”更低,更高。您还会注意到,如果您查看单词“quick”中字符的底部,它们并没有在底部对齐。
这些问题可能看起来很小,但在有大量文字的屏幕上,它开始显得非常不专业。
有人看过这个,或者有解释吗?我希望在以后的 API 中使文本看起来统一。
非常感谢您的宝贵时间!
【问题讨论】:
肯定会出现一些不同的字体渲染。可能是抗锯齿,提示关闭。您能否查看 API 级别 8 和 API 级别 15 的textView.getPaintFlags()
的值并进行编辑? (@我,所以我收到通知,我会看看)
@kcoppock 感谢您的回复。 getPaintFlags() 为两个 API 返回 257。
这看起来很相似,或者可能是 ***.com/questions/9036184/… 的副本。它从未真正得到回答。
@HandlerExploit 是的,当我在论坛中搜索此问题时,我查看了该帖子。它看起来确实很相似,但我认为他们从来没有真正指定过他们不喜欢字体的什么……而且从来没有回答过,所以我想我会特别问一下。 =) 不过,感谢您指出这一点。
我是提出这个问题的人,这听起来就像我们看到的确切问题。唯一的区别是我没有像你那样精确。
【参考方案1】:
好的,所以它似乎在两个实例中都应用了以下标志:
Paint.DEV_KERN_TEXT_FLAG
Paint.ANTI_ALIAS_FLAG
尝试这样做,看看结果是否有任何不同(不一定有所改善,但甚至完全不明显):
textView.setPaintFlags(textView.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG);
【讨论】:
巨大的差异!文字实际上看起来是正确的!非常感谢您的意见。这是现在两个模拟器的截图,左边是 Transformer:!New Text Rendering 太好了!我认为这可能会奏效。我会说他们默认在较新的 API 上禁用了该功能,但是您获得了相同的标志值...我不确定为什么这确实有效,但我很高兴它确实有效。 :) 如果您认为这就是您所需要的,您可以将此问题标记为已回答。 +1 对我有用 - 自定义字体在 2.3 但不是 4.2.2 上正确呈现。帮助很大!!! 相同但文本更少:textView.getPaint().setSubpixelText(true); @middlehut 我不会那样做。getPaint()
的文档说:“请仅使用它来查询 Paint 的属性,不要更改它们。”以上是关于Android 中的自定义字体在不同 API 中的呈现方式不同的主要内容,如果未能解决你的问题,请参考以下文章
android中listvliew中的自定义字体Text-View