【知乎用户的回答(80票)】: android采用了linux的freetype字体库和chrome的2d图形渲染引擎skia来显示字体,这样的选择是为了兼顾清晰和美观,毕竟android手机从高端到低端,ppi差别很大,不可能像ios一样只追求美观,不需要考虑低ppi下字体显示是否清晰(低分辨率显示器显示mac上的字体就不如windows清晰,高分辨率下mac字体更美观)。android的droid sanf设计时要考虑低ppi下小字号的清晰度和高ppi下大字号的美观。 锤子系统通过更换字体可以部分解决高ppi下字体显示效果问题,却没办法根本解决字体库和字体渲染问题,如果有能耐把ios的mactype移植到android才真牛逼,毕竟换字体在任何root了的手机上都轻而易举。 原生android系统要适用高中低所有android手机,字体设计必须考虑兼容性,不考虑这个大前提而贬低android的字体显示效果无异是耍流氓。 【NovaDNG的回答(16票)】: 其实我的理解比较直接, 他就是认为 Android 默认字体 (和第三方 OEM 提供的默认字体) 很丑而已. 他的解决方案就是替换默认中文字体, 用的是 iOS 默认的华文黑体 (呵呵). (不过在我看来他的替代方案在 Android 上显得更丑) 【RuofanWu的回答(2票)】: 理论上是可以通过移植显示字体的库来改变字体渲染效果的,比如Windows下的gdi++也就是现在的mactype。 但是考虑到Android设备成千上万参差不齐的碎片性,这个工作就变得异常复杂。 苹果手机型号少,硬件唯一,开发人员就可以针对一款硬件进行较长时间开发与优化,这就是ios应用总体上体验较好的一个原因。 另外,为什么老罗会那么说? 因为贬低对手的同类作品是提升自我逼格最快的一条路啊!! 【豆腐君的回答(2票)】: 不请自来,回答不完全对题,谨借此地一用,请题主见谅。 最近强迫症爆发,又开始折腾 Android 的字体了,但是最后仍旧以失败告终,于是来吐吐槽。 和 iOS 相比,Android 的“字体系统”最大的一个缺点其实是缺字。昨天看到一个微博,正好体现了 iOS 在 Android 字符数面前的优越感。(由于我找不到原文字,所以没法拿来在自己的手机和电脑上测试。) ![]() 虽然自 Android 2.3 至今,Google 在这方面做了很多努力,增加了阿拉伯语、希伯来语和一些印度语言的高质量字体(我没有具体研究过,如有错误请指正),但是就我们最常用的汉字而言,还是缺字的。 我国对于非嵌入式系统的强制标准 GB18030-2000 包括了全部 Unicode3.0 的汉字,而这其中包括了“最初统一的汉字”和扩展 A 区(Ext-A)汉字。然而 Droid Sans Fallback(Android 默认中文字体)的早期版本对此支持不完善,甚至有部分字出错。某一版的 Droid Sans Fallback 加入了对 CJK Ext-A 区内的汉字支持,但是这个字体却分裂为了 DroidSansFallback.ttf 和 DroidSansFallbackFull.ttf,其中前者有谚文(韩文字母),没有Ext-A 汉字,后者有 Ext-A 汉字却没有谚文。这是为什么呢?我猜是因为该字体的字符数量接近了 ttf 字体的上限(65536个)。DroidSans Fallback 包含基本汉字、假名、谚文及一部分扩展拉丁及符号已超过 51000 字符。(这是由于该字体使用拼接技术保存了大量的汉字共用部件,而这些部件也是计入字符数内的,并不是按码位算。)为了再塞进这近 7000 汉字,不得已一分为二。不过也有说法这么做是为了减少体积,因为 Ext-A 毕竟不常用。而 Ext-B、Ext-C、Ext-D 的汉字要想支持只有加字体一种方法(字符数超出)。 貌似跑题了,其实不然。拼接技术也让这款字体只可远观,正因为此我才想为 Android 换一款高质量的中文字体。大家都觉得冬青黑体逼格高,MIUI 的兰亭黑也不错,可是它们的实际效果如何呢? ![]() 注意“驱”和“的”注意“驱”和“的” ![]() 在手机的屏幕上一像素和两像素的差别很明显在手机的屏幕上一像素和两像素的差别很明显 为什么这些字的笔画粗细不均?我不是 Android 开发者,不了解具体情况,但我猜是因为Android 强制开启了自动 Hinting。之前我怀疑 Android 也使用 Freetype,也许可以像桌面 Linux 那样调教一发,但是我杯具地发现根本就没有类似于配置文件的东西,说不定这些配置已经固化于字节码中了。 而这种奇怪的自动 Hinting居然也在 Roboto(尽管 Roboto 已经内置 Hinting 信息)和 Droid Sans Fallback里面出现…… ![]() 注意“a”“t”较粗(在实机上很明显)注意“a”“t”较粗(在实机上很明显) ![]() 注意“4”“软件”“安”较粗注意“4”“软件”“安”较粗 最要命的是,这个问题还不一定每次都会出现,不知是随机出现还是间歇出现,但这都是逼死强迫症的节奏啊!! 而且这都是在分辨率高于300PPI 的手机上截的图啊,谁说高分屏就能掩饰住渲染引擎的渣了?! 此外,Android 的字体回调(fallback)机制也很诡异。如果在 fallback_fonts.xml 里 Droid Sans Fallback 之上加入一个中文字体的话,那么恭喜,韩文无法显示了。而我用的冬青黑体其实是 XHei WinPhone,这个字体以符号全面著称,但是显示不了这两个颜文字:( ? Д?) Σ(?Д?) 。这是因为,这两个颜文字的眼睛是半角日文半浊音符号,而 XHei 系列字体没有覆盖这部分字符。 但是 Droid SansFallback 有啊,你为什么不去调用啊!!!! 还有更诡异的事情发生了,我用fontforge 把半角假名加入 XHei 后,颜文字依然无法正常显示,甚至连全角字符都有问题了。 _(:3」∠)_ 累了,感觉不会再爱了…… 值得一提的是,Android 对组合字符的支持也不好。 ![]() 【贾一博的回答(1票)】: 不知道为什么又看到这个老问题。之前只是对 @王燕然的答案点了反对,居然没有回答过这个问题,估计因为问题问的实在是太没有水准,又不知道怎么改。想必在知乎其他地方我应该对类似问题有过不少描述。鉴于这个问题下没有特别准确的答案,就再系统地回答一下。 我在回答这个问题 『 iOS 和 Android 字体渲染有何不同?』之前,先把原提问者的两个小问题回答一下。 『Android 字体渲染过程,相比苹果有何不同?』 从渲染过程来说,大体没有什么不同。Font fallback - Layout - Rasterization。 『是否可以通过调整渲染顺序,从而让字体清晰?』 不可以。这不是一个顺序的问题,字体清晰与否取决于很多外部条件,比如屏幕和字体本身。如果只谈论算法,也就是 Rasterization 算法,那也不是顺序的问题。 好的,可以回到正题上来了。 通常来说,我们不能确切的知道 iOS 和 Android 字体渲染有何不同。因为 Android 的代码我们能看到,但是 iOS 的代码我们看不到。所以只能把问题分解为两个部分。 1. Android 字体渲染是什么样子的? 2. 关于 iOS 字体渲染有哪些推测? 那么 Android 字体渲染是什么样子的呢。 目前 KitKat 用的是 FreeType 2.4.12,并且关闭了之前旧的 CFF 引擎,也就是用的 Adobe 贡献的新 CFF 引擎。其他的 FreeType 2 众多的配置 Android 完全没有动,只是裁剪掉了很多用不上的字体渲染引擎。 Layout Engine 非常之简陋,只是算了经过 harfbuzz_ng 处理过的字符串长度进行了简单的换行处理。不能进行图文混排,以及字符串内不同 Style 的处理。也就是同一个字符串(没有 fallback 到不同字体的情况下)必须是同一种字体、字重和颜色等。 -----------------------未完,待续 原文地址:知乎 |
|