android字体详解

最近了解了一下字体,发现彻底解释明白这件事情真的很不容易。

android:fontWeight属性

值是int,范围是1~1000,系统默认字体的weight是400
常用属性值和通常的名字对应关系如下
| Value | Common weight name |
|——-|——————–|
|100 |thin
|200 |Extra Light(Ultra Light)
|300 |Light
|400 |Normal(Regular、Book、Roman)
|500 |Medium
|600 |Semi Bold(Demi Bold)
|700 |Bold
|800 |Extra Bold(Ultra Bold)
|900 |Black (Heavy)

注:为什么说是通常呢?因为在有些字库下是有差异的,比如在Adobe Typekit字库中对字重描述的划分列表中,它列出Heavy指的是800而不是900。另外,在我们日常使用的Photoshop和Sketch里面,Ultra Light是100,而Thin是200。

css中还有bolder、lighter
bolder、lighter表示其字重值是基于从其父元素继承而来的字重计算所得的,与normal、bold所代表的字重并无关系。
其值通常是根据下表计算而得的:
|继承值|bolder所代表的字重|lighter所代表的字种|
|:—:|:—:|:—:|
|100|400|100|
|200|400|100|
|300|400|100|
|400|700|100|
|500|700|100|
|600|900|400|
|700|900|400|
|800|900|700|
|900|900|700|

字体匹配算法

如果指定的font-weight数值,即所需的字重,能够在字体中找到对应的字重,那么就匹配为该对应的字重。否则,使用下面的规则来查找所需的字重并渲染:

  • 如果所需的字重小于400,则首先降序检查小于所需字重的各个字重,如仍然没有,则升序检查大于所需字重的各字重,直到找到匹配的字重。
  • 如果所需的字重大于500,则首先升序检查大于所需字重的各字重,之后降序检查小于所需字重的各字重,直到找到匹配的字重。
  • 如果所需的字重是400,那么会优先匹配500对应的字重,如仍没有,那么执行第一条所需字重小于400的规则。
  • 如果所需的字重是500,则优先匹配400对应的字重,如仍没有,那么执行第二条所需字重大于500的规则。

衬线字体(serif)和无衬线字体(sans serif)

西方国家字母体系分为两类:衬线字体(serif)以及无衬线体(sans serif)。
衬线字体,意思是在字的笔画开始、结束的地方有额外的装饰,而且笔画的粗细会有所不同。
无衬线体是无衬线字体,没有这些额外的装饰,而且笔画的粗细差不多。

从Android 8.0(API 26)开始,支持通过资源文件的方式引用字库

详见android O 在xml文件中引用字体