【教程】深入解读安卓字体机制,这一篇就够了,搞定所有安卓手机字体全局替换和粗细分明
上面这个安卓小机器人图,和平常的小绿人有点不同哦,大家有没有觉得像这个……周冬雨的凝视^0^
Android 4.4及之前字体配置文件:fallback_fonts.xml
Android 5.0-6.0的配置文件:fonts.xml 和 fallback_fonts.xml
Android 7.0之后的配置文件:fonts.xml
这些配置文件都在system/etc路径下,安卓5.0-6.0是一个过渡阶段,同时有2个配置文件。
安卓5.0-6.0的Google的代码备注里写着,旧文件fallback_fonts.xml是用来兼容没对高版本安卓做特殊适配的app的,到了安卓7.0就才抛弃了旧配置文件。
也就是说,安卓5.0-6.0上,凡是新配置文件中无法定义到的字体,都会用旧的配置文件去显示,保险起见,我们增删改安卓5.0-6.0配置文件时,需要两个一起改。安卓7.0之后就不需要改2个了。
注意,有些定制设备,还存在 /vendor/etc/fallback_fonts.xml ,这个文件的优先级是高于系统默认的配置文件的,这也是google的代码注释里提及的规则。简而言之,如果你无论怎么替换总会有些字符改不到,那可能是定制的配置文件优先调用了另一个字体里的字符。我手里没这种设备,所以没深入研究,如果你遇到了,请自行变通。
旧配置 fallback_fonts.xml基本上只有字体家族的调用列表,几乎没啥扩展空间;
而新版本fonts.xml则精确到了字重,可发挥空间更大,也是我们换字体的重大依仗。
如果你是安卓4.4及以下的系统,直接把得到的字体改成DroidsansFallback.ttf,替换到手机里好了,没啥好改配置文件的了。
如果你是安卓5.0以上的安卓系统,往下看,把你的手机字体显示能力发挥到最大。
百度一下【Notepad++】,这款电脑软件是比较专业的看文本的工具,尤其是看安卓字体配置文件,会很方便,如果你直接用普通的txt编辑器改,是容易出问题的。
我们先打开 fallback_fonts.xml,不同的手机可能会有差异,原生安卓6.0的是这样的:
<family>
<fileset>
<file>NotoSansSC-Regular.otf</file>
</fileset>
</family>
<family>
<fileset>
<file>NotoSansTC-Regular.otf</file>
</fileset>
</family>
<family>
<fileset>
<file>NotoSansJP-Regular.otf</file>
</fileset>
</family>
<family>
<fileset>
<file>NotoSansKR-Regular.otf</file>
</fileset>
</family>
不要看到代码就望而却步,这是很简单的,其实就是从上到下规定了四个字体,分别是简体中文、繁体中文、日文、韩文,如果前面那个文件没有这个字符,系统就用后面那个字体来补上。
然后你就会发现,好像除了改改字体的文件名,似乎啥也改不了的啊,对,你说的没错……所以前面我才说,如果你是安卓4.4及以下的,直接替换系统文件就拉倒了,因为玩不下去了啊。
但是,你需要知道,类似miui主题字体、substratum主题字体、CM主题字体这些,覆盖不到字体的地方,你改配置文件里指向的字体文件,是可以搞定的。
因为这个配置明确告诉了你,在安卓5.0-6.0的手机上,使用旧配置兼容模式执行的字体,文件名叫什么,这样就有了方向,你是要改配置文件里的字体文件名,还是要替换系统字体,都可以做到了。
再来看fonts.xml,这个就厉害多了,毕竟在安卓5.0之后才出现,我们通过改这个来换字体,简直有如神助啊。
</family>
<family>
<font weight="400" style="normal">NotoSansSC-Regular.otf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansTC-Regular.otf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansJP-Regular.otf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansKR-Regular.otf</font>
</family>
同样是简体中文、繁体中文、日文、韩文四个字体的调用规则,但我们可以看到多了2个参数。
一个是weight,一个是style。weight就是字重,也就是字体粗细的程度;style是字体风格,一般来说是常规的和斜体的两种。
我们完全可以自己来定义不同weight和不同style调用不同的字体文件,来达到苹果手机那样粗细分明的效果,甚至更甚一筹,连斜体都能特别定义。
举个例子,你可以设置粗体用雅黑,常规用宋体,斜体用楷体,这就累死很多书籍和报纸的排版效果了。
前面说到了fonts.xml的强大扩展能力,那么我们应该怎么去扩展呢?
安卓其实给我们做好了范例,也就是默认英文字体的配置写法:
<family name="sans-serif">
<font weight="100" style="normal">Roboto-Thin.ttf</font>
<font weight="100" style="italic">Roboto-ThinItalic.ttf</font>
<font weight="300" style="normal">Roboto-Light.ttf</font>
<font weight="300" style="italic">Roboto-LightItalic.ttf</font>
<font weight="400" style="normal">Roboto-Regular.ttf</font>
<font weight="400" style="italic">Roboto-Italic.ttf</font>
<font weight="500" style="normal">Roboto-Medium.ttf</font>
<font weight="500" style="italic">Roboto-MediumItalic.ttf</font>
<font weight="900" style="normal">Roboto-Black.ttf</font>
<font weight="900" style="italic">Roboto-BlackItalic.ttf</font>
<font weight="700" style="normal">Roboto-Bold.ttf</font>
<font weight="700" style="italic">Roboto-BoldItalic.ttf</font>
</family>
有了前面的基础,这段代码就很容易解读了,一共是100、300、400、500、700、900这6个不同粗细字重,又区分normal、italic两种风格(正常风格和斜体风格)。
我们完全可以照着这个来仿写。
其中 400 weight对应的是正常粗细,700 weight对应的最常用的粗体,300 weight对应的是最常用的细体。
一款中文替换字体,如果包含上面3个字重,排版效果就已经差强人意(这个成语是勉强让人满意的意思,不管咋样就是满意的意思,很多小说的文盲作者当作不满意来用,简直有辱斯文啊)了。
比如这么写:
<family>
<font weight="300" style="normal">NotoSansSC-Light.otf</font>
<font weight="400" style="normal">NotoSansSC-Regular.otf</font>
<font weight="400" style="italic">Kaiti.ttf</font>
<font weight="700" style="normal">NotoSansSC-Bold.otf</font>
</family>
细体NotoSansSC-Light.otf、常规体NotoSansSC-Regular.otf、斜体Kaiti.ttf、粗体NotoSansSC-Bold.otf都指定好了文件,再把对应文件名的同名字体文件丢到system/fonts下,重启手机就OK了。
不过,一般中文不需要自己去定义斜体,系统会在需要斜体中文的地方自己渲染成斜体的,毕竟基本上没有这种官方斜体中文字体,自己去改一个就没必要了。
以我写的信黑体配置文件为例:
<!-- //++[Feature][宁静之雨][2017/01/13][Font] Chinese font customization -->
<family lang="zh-Hans">
<font weight="300" style="normal">NotoSansSC-Light.otf</font>
<font weight="400" style="normal">NotoSansSC-Regular.otf</font>
<font weight="500" style="normal">NotoSansSC-Medium.otf</font>
<font weight="700" style="normal">NotoSansSC-Bold.otf</font>
</family>
<family lang="zh-Hant">
<font weight="300" style="normal">NotoSansSC-Light.otf</font>
<font weight="400" style="normal">NotoSansSC-Regular.otf</font>
<font weight="500" style="normal">NotoSansSC-Medium.otf</font>
<font weight="700" style="normal">NotoSansSC-Bold.otf</font>
</family>
<!-- //~~[Feature][宁静之雨][2017/01/13][Font] Chinese font customization -->
一共2个大段,分别是简体中文和繁体中文,为了省事,我调用的文件都是一样的。然后把信黑的4个字体文件丢到system/fonts下重启手机就生效。
原文下面还有韩文和日文的配置,咱们不用改,就用系统原来的文件即可,所以说,如果你是严格按照配置文件来换的字体,那么字体文件里有没有韩文日文并不是很必要。
再看一眼安卓7.0的fonts.xml汉字区的配置,更高级一些。
<family>
<font weight="400" style="normal" index="2">NotoSansCJK-Regular.ttc</font>
</family>
<family>
<font weight="400" style="normal" index="3">NotoSansCJK-Regular.ttc</font>
</family>
<family>
<font weight="400" style="normal" index="0">NotoSansCJK-Regular.ttc</font>
</family>
<family>
<font weight="400" style="normal" index="1">NotoSansCJK-Regular.ttc</font>
</family>
会发现多了index这么个玩意儿,实际上是和安卓7.0使用ttc字体有关的。一个ttc字体是有多个ttf文件组合而成,配置文件的index是告诉系统,不同语言去调取ttc内部的哪个文件的。
所以大家会在我的字体里发现NotoSansCJK-Regular.ttc这个玩意儿,其实这个换不换影响不大的,但是有些app比较顽固,比如多看阅读,默认的看书字体就是用这个字体文件,按理说他应该读取中文环境下正确的字体,但奇葩的是如果你动了中文部分的字体配置,多看阅读会调用日文下的汉字……
并且NotoSansCJK-Regular.ttc在日文环境下的日系汉字是有问题的,比如“复”、“关”都是只有半个汉字的宽度。
所以我重新打的NotoSansCJK-Regular.ttc里,日文环境和中文环境对应的index其实是一样的,避免部分顽固app出现问题。
再来一段安卓7.0上,我信黑字体的中文部分完整配置,很简单,只要你看明白了,在自己手机上就能轻松仿写出来。
<!-- //++[Feature][宁静之雨][2017/01/13][Font] Chinese font customization -->
<family lang="zh-Hans">
<font weight="300" style="normal">NotoSansSC-Light.otf</font>
<font weight="400" style="normal">NotoSansSC-Regular.otf</font>
<font weight="500" style="normal">NotoSansSC-Medium.otf</font>
<font weight="700" style="normal">NotoSansSC-Bold.otf</font>
</family>
<family lang="zh-Hant">
<font weight="300" style="normal">NotoSansSC-Light.otf</font>
<font weight="400" style="normal">NotoSansSC-Regular.otf</font>
<font weight="500" style="normal">NotoSansSC-Medium.otf</font>
<font weight="700" style="normal">NotoSansSC-Bold.otf</font>
</family>
<!-- //~~[Feature][宁静之雨][2017/01/13][Font] Chinese font customization -->
<family>
<font weight="400" style="normal" index="2">NotoSansCJK-Regular.ttc</font>
</family>
<family>
<font weight="400" style="normal" index="3">NotoSansCJK-Regular.ttc</font>
</family>
<family>
<font weight="400" style="normal" index="0">NotoSansCJK-Regular.ttc</font>
</family>
<family>
<font weight="400" style="normal" index="1">NotoSansCJK-Regular.ttc</font>
</family>
配置上面插入了自己定义的汉字调用规则,后面仍然保留系统自己的调用规则。
这样的话,系统会从上到下去识别,妥妥的就把字体替换好了,并且粗细分明。
顺便提一下,我解包看过HTC 10国际版的安卓7.0的ROM,他的官方信黑粗细2个字重,也是和我这个改法完全一样的。
同样,小米的的官方小米兰亭、锤子的官方冬青黑,都是用这种方法改的字体。
教程到此就结束了。
只要你看明白了,完整全局替换系统字体就完全不是问题;
只要你学透彻了,安卓手机字体粗细分明就太轻松搞定了;
只要你会举一反三,什么小米魅族三星以及各种杂七杂八的手机,用我分享的字体花一分钟改改,就适配到自己手机上了。
你要做的,仅仅是把原机字体配置文件取出来,照着我的配置抄一遍而已。
为啥不能直接用我的替换?
你见过抄作业把别人名字都抄到作业本上去的吗……不同手机是有差异的。
我是用原生安卓来做的。
世界上那么多安卓手机,我不可能全买过来给你适配一遍(你买来送我,这倒是可以考虑),你必须学会自己动手,学会后也就一分钟改好的事情。
如果还是不想学习,那么想办法自己做字体apk包吧。
再补充一点,使用re管理器等工具替换系统字体文件的时候,可能会造成系统界面崩溃一次自动重启(系统检测到正在使用的文件被修改了,就错乱了),这时候打开一些app会闪退,需要手工重启一次手机,以后就完美了。
最后分享个小窍门,微信和QQ的网页内置浏览器存在以下问题:
1、字体渲染,并没有严格遵照fonts.xml实现多字重挂载,替换多字重后会自动变成恶心的伪粗体
2、网页加载效率,一些外卖红包领取页面走微信登录校验,经常第一遍会卡死,第二遍才正常访问
这些都是QQ浏览器内核搞的鬼。
如果想解决以上问题,安卓5.0+只要切换浏览器的内核为安卓默认的chrome内核就行。
在公众号回复“浏览器内核”获取解决方案。
本帐号交流分享苹果和安卓美化,
如果觉得对你有帮助的话~
请打赏宁静之雨
长按识别二维码,使用微信支付