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中的所有视图使用相同的自定义字体?

android中listvliew中的自定义字体Text-View

Xamarin 表单:UWP 和 Windows 8.1 中的自定义字体

android中的自定义视图

Xcode Playground 中的自定义字体

默认情况下为Android中的TextView设置不同的字体[重复]