前言
fonts.xml
是 Android 系统中的一个配置文件,用于定义系统中使用的字体相关信息。由于 Android 系统支持多种语言,而每种语言的文字字体可能有所不同,因此需要对字体进行精细调整,以确保在各种情况下都能获得良好的显示效果。
如果你进行相关的定制开发,理解和熟悉 fonts.xml
文件的内容是至关重要的。这个文件包含了系统中各种语言和字体的映射关系,通过它可以调整字体的使用方式,以满足特定的需求和显示效果。深入了解 fonts.xml
可以为定制化开发提供必要的指导和信息。
一、weight(字重)
字重即字体笔划的粗细,如下:
通常的划分是:
100——淡体 Thin/Hairline
200——特细 Extra-Light/Ultra-Light
300——细体 Light
350——次细 Demi-Light
400——标准 Regular/Normal/Book/Plain
500——适中 Medium
600——次粗 Demi-Bold/Semi-Bold
700——粗体 Bold
800——特粗 Extra-bold/Extra
900——浓体 Black/Heavy
950——特浓 Extra-Black/Ultra-Black
在fonts.xml中,如下图,表示在sans_serif的字族下,对于不同的字重会使用不同的字体文件。
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
二、style(样式)
fonts.xml中使用的样式有normal(普通)和italic(斜体)
在字体的体系中,还有sans serif(非衬线体)、serif(衬线体)、nonospace (等宽字体)。
- 如下图,serif衬线体即在笔画开始结束的地方有标记,宋体就属于serif衬线体。
- sans serif非衬线体则是笔画开始结束的地方无标记,黑体就属于sans serif非衬线体。
Google原生系统默认使用的就是非衬线体。 - nonospace 则是限制了每个字符的宽度,让每个字符都达到一个等宽的效果。
三、lang(系统语言)
例如当前选择了中文作为系统语言,对应的lang是“zh-Hans”。如果默认字体中缺少部分字符,则会在“zh-Hans”下指定的字体文件中寻找缺失的字符进行显示。
在Android中,默认使用的Roboto.ttf中就没有中文字符。于是会使用zh-Hans下指定的ttf中的字符。
对应的如果选择了英语作为系统语言,则会在lang为"en"下指定的字体文件中寻找缺失的字符。
如果默认使用的字体中没有缺失的字符的话,是不会使用这些lang下面的字体文件的,不管选择什么样的系统语言。
四、variant(变体)
变体分为elegant(优雅)和compact(压缩),这是因为在有些语言中(比如泰文),可能会出现一些非常高的字形,比如下图的左边。
这样的原始(优雅)版本既是elegant(优雅)。
为了让这些很高的文字在和普通文字放在一起的时候看起来不会显得太奇怪,于是会进行压缩,事实上,Paint 绘制文字时是用的默认版本就是压缩版本,就像下图这样。这样的压缩版本既是compact(压缩)。
五、axis(轴标记)
轴标记是应用在可变字体中的。可变字体简单来说,就是单个字体文件可以同时支持多个字体形态,而一般的字体文件则只能支持单一的字体形态,不同的字重要对应不同的一般字体文件。
对于可变字体的介绍,可以看 可变字体
可变字体有3个轴可以进行调节,从而得到不同的字体效果,3个轴分别是weight(字重)、width(宽度)、height(高度)
可变字体
再来看font.xml中,可以看到虽然是不同的字重,但是都使用的是NotoSansKhmer-VF.ttf这一个可变字体,通过调节这个字体的wdth(自宽)和wght(字重)来匹配系统的不同的字重效果。
六、fonts.xml的fallback
语言的种类很多,对应的也会有非常多的字符,一个字体文件是不可能包含全部的字符的,当指定使用一个字体时,如果该字体缺少当前需要显示的字符,那么就会用到fallback fonts,即有后备的字体可供使用,以使得设备至少能进行基础的显示。
在fonts.xml文件中,fallback fonts之后指定的内容都是fallback的,我们见得最多的就是中文字符。
在系统原生默认使用的Roboto字体中,是没有中文字符的,但是我们的设备也能够正常显示汉字,使用的就是zh-Hans下所指定的字体文件。
如果我们需要定制系统的中文字体,可以通过修改zh-Hans下所指定的字体文件来达到目的。
七、.notdef
在字体ttf文件的第一个字符一般是定义了当无法显示时所使用的.notdef字符。
一般或多或少都遇到无法显示的情况,有的会显示为空的框,有的显示为框中的X。这个就是.notdef字符。
.notdef字形的形状
.notdef字形对于向用户提供反馈信息非常重要,以指示在字体中未找到对应的字形。这个字形不应该没有轮廓,因为如果缺少字形,用户将只看到类似于空格的形状,而不会意识到当前字体存在的限制。
建议的.notdef字形的形状可以是空矩形、带有问号的矩形,或者带有“X”的矩形。创意形状,比如漩涡或其他符号,可能不会被用户识别为表示该位置缺少字形,并且未在该位置显示。
在设计.notdef字形时,建议使用简单明了的形状,以确保用户能够准确理解该位置确实缺少对应的字形。这样,用户就能够得到直观的反馈,而不至于被误导或误解字体的表现。