我正在开发一款Android应用程序,需要使用Roboto字体来呈现UI。
根据https://github.com/google/roboto/releases,有三种类型的Roboto字体:
Google说:
提示字体
提示是嵌入在字体中的有关如何修改的说明 (扭曲)字形在低分辨率显示器上看起来更好。作为一个 权衡,一个暗示字体消耗比未着色版本更多的空间。
Roboto和Noto都有暗示和未暗示的版本。谷歌 建议:
- 在Android和Mac OS X上使用未提示的版本,但未实现提示。
- 在Chrome操作系统,Windows和Linux上使用提示字体。
roboto-android 和 roboto-unhinted 之间有什么区别?
答案 0 :(得分:3)
传统屏幕是低分辨率显示器。
事实上,如此低分辨率,只是缩放字体字形在常见的文本大小上可怕地像素化。因此,文本渲染系统不仅仅缩放文本,它们会扭曲字形,使它们尽可能地匹配像素限制(网格拟合)。
Microsoft历来通过字体提示(智能字体→TTF)实现此功能:字体文件本身包含有关每种字形应如何在特定大小下扭曲的指令(代码)。优点是您的文本渲染器不需要非常智能。缺点是只有有人花了很多时间编写提示规则的字体才能在屏幕上显示,而且只有在这个人所针对的特定像素密度下才会这样(这就是为什么微软试图强迫制造商只生产96 dpi屏幕的原因)。
Apple选择专注于哑字体(postscript和children→CFF字体),使用智能渲染引擎(对所有字体应用相同的规则)。
字体格式现在以opentype(TTF + OTF)合并,但字体仍然可以以哑模式呈现(文本渲染器控制失真)智能模式(字体提示控制失真),或两者的混合
由于Linux禁止通过合法性访问Windows字体,但仍然托管了许多为TTF字体编写的应用程序,因此Linux文本渲染器能够计算未提示的TTF字体的动态合成提示。
无论如何,对于智能手机和hidpi屏幕等高分辨率显示器而言,网格配合无关紧要。在缩放期间像素足够小,舍入误差和像素对齐不匹配可忽略不计。
因此:
- Android:不需要提示字体,因为它用于高分辨率显示器,并且无论如何可能会自动计算提示,因为它是Linux变体
- Apple:从来没有TTF或面向提示,现在使用高分辨率显示器
- Windows:经常与低分辨率显示器一起使用,许多应用程序仍然使用旧的哑渲染堆栈,如果没有提示将无法正确匹配网格
- ChromeOS和Linux:可以在低分辨率显示器上使用,可以自动计算提示,不一定需要提示字体,但Google可能会付钱给某人手动提示字体,因此它会更好地考虑内置提示(暗示)这些天过程:使用Linux引擎自动计算提示,然后手动检查它是否运行正常,需要时更正,将更正后的计算添加到字体文件中。最好的自动铰链产生干净的形状但有时扭曲太多意味着字形词干,这是对齐,不再对齐,因为算法将一个形状移动到上像素线,下一个形状移动到下像素线。人类在识别和修复此类情况方面真的更好。)
现代字体格式是遗留元数据的可怕的babel塔,以取悦所有类型的软件(通常:微软使用A,Apple B,OS / 2 C和Adobe D,让我们把ABC和D放在新格式中,这样每个人都很开心除了ABC和D都有自己的缺点,让我们添加E,这对于下一代软件更好。 Android版本比没有暗示的版本小一点,谷歌可能剥夺了Android从这个版本中不使用的所有元数据。只要您只在Android上使用它,它就可以和未打印的版本一起使用,并且您将节省存储空间。
答案 1 :(得分:1)
以下是您可以阅读Roboto
文字的问题:https://bugs.chromium.org/p/chromium/issues/detail?id=168899。
一些有用的观点:
Windows上的Google Chrome浏览器必须使用auto-hinting capability
的渲染器,例如FreeType
。 Windows渲染器使用Roboto
目前正在使用的{{1>}等未打印的字体做得不好。