现在是:
广告热线:  |  设为首页 | 加入收藏
登陆用户名:
密码:
您现在的位置连云港信息网 > 商讯 > >正文内容

「教程」深入解读安卓字体机制,搞定安卓手机字体替换和粗细分明

来源: 发布时间:2020-06-25 07:14:25 阅读:-

了解更多字体、手机测评等内容,请关注“宁静之雨”gongzhonghao。

「教程」深入解读安卓字体机制,搞定安卓手机字体替换和粗细分明

一篇就够了,只要你读透了,再加上我分享的字体,就能举一反三,在任意一台能root的安卓手机上完美全替换字体,并且实现多粗细调用。

上面这个安卓小机器人图,和平常的小绿人有点不同哦,大家有没有觉得像这个……周冬雨的凝视^0^

「教程」深入解读安卓字体机制,搞定安卓手机字体替换和粗细分明

1.初识配置文件

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以上的安卓系统,往下看,把你的手机字体显示能力发挥到最大。

2.解读配置文件

百度一下【Notepad++】,这款电脑软件是比较专业的看文本的工具,尤其是看安卓字体配置文件,会很方便,如果你直接用普通的txt编辑器改,是容易出问题的。

「教程」深入解读安卓字体机制,搞定安卓手机字体替换和粗细分明

我们先打开 fallback_fonts.xml,不同的手机可能会有差异,原生安卓6.0的是这样的:

NotoSansSC-Regular.otf

NotoSansTC-Regular.otf

NotoSansJP-Regular.otf

NotoSansKR-Regular.otf

不要看到代码就望而却步,这是很简单的,其实就是从上到下规定了四个字体,分别是简体中文、繁体中文、日文、韩文,如果前面那个文件没有这个字符,系统就用后面那个字体来补上。

然后你就会发现,好像除了改改字体的文件名,似乎啥也改不了的啊,对,你说的没错……所以前面我才说,如果你是安卓4.4及以下的,直接替换系统文件就拉倒了,因为玩不下去了啊。

但是,你需要知道,类似miui主题字体、substratum主题字体、CM主题字体这些,覆盖不到字体的地方,你改配置文件里指向的字体文件,是可以搞定的。

因为这个配置明确告诉了你,在安卓5.0-6.0的手机上,使用旧配置兼容模式执行的字体,文件名叫什么,这样就有了方向,你是要改配置文件里的字体文件名,还是要替换系统字体,都可以做到了。

「教程」深入解读安卓字体机制,搞定安卓手机字体替换和粗细分明

再来看fonts.xml,这个就厉害多了,毕竟在安卓5.0之后才出现,我们通过改这个来换字体,简直有如神助啊。

NotoSansSC-Regular.otf

NotoSansTC-Regular.otf

NotoSansJP-Regular.otf

NotoSansKR-Regular.otf

同样是简体中文、繁体中文、日文、韩文四个字体的调用规则,但我们可以看到多了2个参数。

一个是weight,一个是style。weight就是字重,也就是字体粗细的程度;style是字体风格,一般来说是常规的和斜体的两种。

我们完全可以自己来定义不同weight和不同style调用不同的字体文件,来达到苹果手机那样粗细分明的效果,甚至更甚一筹,连斜体都能特别定义。

举个例子,你可以设置粗体用雅黑,常规用宋体,斜体用楷体,这就累死很多书籍和报纸的排版效果了。

3.修改配置文件

前面说到了fonts.xml的强大扩展能力,那么我们应该怎么去扩展呢?

安卓其实给我们做好了范例,也就是默认英文字体的配置写法:

Roboto-Thin.ttf

Roboto-ThinItalic.ttf

Roboto-Light.ttf

Roboto-LightItalic.ttf

Roboto-Regular.ttf

Roboto-Italic.ttf

Roboto-Medium.ttf

Roboto-MediumItalic.ttf

Roboto-Black.ttf

Roboto-BlackItalic.ttf

Roboto-Bold.ttf

Roboto-BoldItalic.ttf

有了前面的基础,这段代码就很容易解读了,一共是100、300、400、500、700、900这6个不同粗细字重,又区分normal、italic两种风格(正常风格和斜体风格)。

我们完全可以照着这个来仿写。

其中 400 weight对应的是正常粗细,700 weight对应的最常用的粗体,300 weight对应的是最常用的细体。

一款中文替换字体,如果包含上面3个字重,排版效果就已经差强人意(这个成语是勉强让人满意的意思,不管咋样就是满意的意思,很多小说的文盲作者当作不满意来用,简直有辱斯文啊)了。

比如这么写:

NotoSansSC-Light.otf

NotoSansSC-Regular.otf

Kaiti.ttf

NotoSansSC-Bold.otf

细体NotoSansSC-Light.otf、常规体NotoSansSC-Regular.otf、斜体Kaiti.ttf、粗体NotoSansSC-Bold.otf都指定好了文件,再把对应文件名的同名字体文件丢到system/fonts下,重启手机就OK了。

不过,一般中文不需要自己去定义斜体,系统会在需要斜体中文的地方自己渲染成斜体的,毕竟基本上没有这种官方斜体中文字体,自己去改一个就没必要了。

以我写的信黑体配置文件为例:

NotoSansSC-Light.otf

NotoSansSC-Regular.otf

NotoSansSC-Medium.otf

NotoSansSC-Bold.otf

NotoSansSC-Light.otf

NotoSansSC-Regular.otf

NotoSansSC-Medium.otf

NotoSansSC-Bold.otf

一共2个大段,分别是简体中文和繁体中文,为了省事,我调用的文件都是一样的。然后把信黑的4个字体文件丢到system/fonts下重启手机就生效。

原文下面还有韩文和日文的配置,咱们不用改,就用系统原来的文件即可,所以说,如果你是严格按照配置文件来换的字体,那么字体文件里有没有韩文日文并不是很必要。

4.安卓7.0的配置文件

再看一眼安卓7.0的fonts.xml汉字区的配置,更高级一些。

NotoSansCJK-Regular.ttc

NotoSansCJK-Regular.ttc

NotoSansCJK-Regular.ttc

NotoSansCJK-Regular.ttc

会发现多了index这么个玩意儿,实际上是和安卓7.0使用ttc字体有关的。一个ttc字体是有多个ttf文件组合而成,配置文件的index是告诉系统,不同语言去调取ttc内部的哪个文件的。

所以大家会在我的字体里发现NotoSansCJK-Regular.ttc这个玩意儿,其实这个换不换影响不大的,但是有些app比较顽固,比如多看阅读,默认的看书字体就是用这个字体文件,按理说他应该读取中文环境下正确的字体,但奇葩的是如果你动了中文部分的字体配置,多看阅读会调用日文下的汉字……

并且NotoSansCJK-Regular.ttc在日文环境下的日系汉字是有问题的,比如“复”、“关”都是只有半个汉字的宽度。

所以我重新打的NotoSansCJK-Regular.ttc里,日文环境和中文环境对应的index其实是一样的,避免部分顽固app出现问题。

再来一段安卓7.0上,我信黑字体的中文部分完整配置,很简单,只要你看明白了,在自己手机上就能轻松仿写出来。

NotoSansSC-Light.otf

NotoSansSC-Regular.otf

NotoSansSC-Medium.otf

NotoSansSC-Bold.otf

NotoSansSC-Light.otf

NotoSansSC-Regular.otf

NotoSansSC-Medium.otf

NotoSansSC-Bold.otf

NotoSansCJK-Regular.ttc

NotoSansCJK-Regular.ttc

NotoSansCJK-Regular.ttc

NotoSansCJK-Regular.ttc

配置上面插入了自己定义的汉字调用规则,后面仍然保留系统自己的调用规则。

这样的话,系统会从上到下去识别,妥妥的就把字体替换好了,并且粗细分明。

顺便提一下,我解包看过HTC 10国际版的安卓7.0的ROM,他的官方信黑粗细2个字重,也是和我这个改法完全一样的。

同样,小米的的官方小米兰亭、锤子的官方冬青黑,都是用这种方法改的字体。

教程到此就结束了。

只要你看明白了,完整全局替换系统字体就完全不是问题;

只要你学透彻了,安卓手机字体粗细分明就太轻松搞定了;

只要你会举一反三,什么小米魅族三星以及各种杂七杂八的手机,用我分享的字体花一分钟改改,就适配到自己手机上了。

你要做的,仅仅是把原机字体配置文件取出来,照着我的配置抄一遍而已。

为啥不能直接用我的替换?

你见过抄作业把别人名字都抄到作业本上去的吗……不同手机是有差异的。

我是用原生安卓来做的。

世界上那么多安卓手机,我不可能全买过来给你适配一遍(你买来送我,这倒是可以考虑),你必须学会自己动手,学会后也就一分钟改好的事情。

如果还是不想学习,那么想办法自己做字体apk包吧。

再补充一点,使用re管理器等工具替换系统字体文件的时候,可能会造成系统界面崩溃一次自动重启(系统检测到正在使用的文件被修改了,就错乱了),这时候打开一些app会闪退,需要手工重启一次手机,以后就完美了。


最后分享个小窍门,微信和QQ的网页内置浏览器存在以下问题:

1、字体渲染,并没有严格遵照fonts.xml实现多字重挂载,替换多字重后会自动变成恶心的伪粗体

2、网页加载效率,一些外卖红包领取页面走微信登录校验,经常第一遍会卡死,第二遍才正常访问

这些都是QQ浏览器内核搞的鬼。

如果想解决以上问题,安卓5.0+只要切换浏览器的内核为安卓默认的chrome内核就行。

“浏览器内核”问题解决方案

微信和QQ的内置网页浏览器(webview),以及QQ浏览器内核的各种浏览器,存在以下问题:

1、字体渲染,并没有严格遵照fonts.xml实现多字重挂载,替换多字重后会自动变成恶心的伪粗体

2、网页加载效率,一些外卖红包领取页面走微信登录校验,经常第一遍会卡死,第二遍才正常访问

如果想解决以上问题,可以切换到Chrome内核。

访问 http://debugtbs.qq.com/

打开后选择清除TBS内核,再强制启用系统内核,重启后选择查看内核版本如果显示0,就已经强制切到系统webview内核。

(正文已结束)

推荐阅读:笔记本电脑有哪些品牌

免责声明及提醒:此文内容为本网所转载企业宣传资讯,该相关信息仅为宣传及传递更多信息之目的,不代表本网站观点,文章真实性请浏览者慎重核实!任何投资加盟均有风险,提醒广大民众投资需谨慎!

网站简介 - 联系我们 - 营销服务 - XML地图 - 版权声明 - 网站地图TXT
Copyright.2002-2019 连云港信息网 版权所有 本网拒绝一切非法行为 欢迎监督举报 如有错误信息 欢迎纠正