安卓系统的默认字体族是什么?

70

从API 16开始,Jellybean Roboto被引入为可用的字体系列。查看Android 16中的“新功能”此处.

TextView上指定android:fontFamily="sans-serif"(在API 16+中为Roboto),会将TextView的默认fontFamily设置为此字体系列吗?

是什么?

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

等同于

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:fontFamily="sans-serif" />

Material design typography website

"Roboto和Noto是Android和Chrome的标准字体."

维基百科

"Roboto是一种无衬线字体家族,由Google开发,作为其移动操作系统Android的系统字体。"

我在文档中没有看到Android默认的fontFamily是什么。参见以下引用:


1
您输入的这两个条目是等价的。虽然它们没有称之为“sans-serif” Roboto,但实际上它是Android中的默认字体系列。 - Weava
为什么这个被踩了? - Jared Burrows
@Weava,你有支持这个的文档链接吗? - Jared Burrows
1
不好意思,但是Jared Rummier给出了一个比我更好的答案 :) - Weava
参考资料:“在Android中,Noto字体是所有原始Roboto未覆盖的语言的默认字体。”- 来源 - Irfan Latif
1个回答

84

d.android.com上没有字体系列名称的文档。但是,如果您查看AOSP,默认字体将加载在android.graphics.*中。 FontListParser/system/etc/fonts.xml(Android 5.0+)或/system/etc/system_fonts.xml(Android 4.1)加载默认字体。默认字体加载在Typeface#init中。

这两个XML文件都有一些文档。第一个字体是默认字体。您可以从设备中提取/system/etc/fonts.xml。设备制造商或自定义ROM可能会更改默认系统字体。

fonts.xml(API 21+)

注意:这是支持更丰富的权重选择的系统字体配置的新版本(L)。一些应用程序将期望旧版,因此请确保将system_fonts.xml和fallback_fonts.xml与任何更改保持同步,即使框架仅读取此文件。

所有没有名称的字体都添加到默认列表中。根据匹配选择字体:完整的BCP-47语言标记(包括脚本),然后是仅语言,最后是顺序(包含该字形的第一个字体)。

出现顺序也是权重匹配的决定因素。这就是为什么Roboto的900重量优先于700重量的原因 - 当请求800重量时,我们更喜欢前者。由于粗体跨度有效地将300添加到权重中,因此这确保900是与500重量配对的粗体,以确保充分的对比度。

system_fonts.xml(API 16-20)

系统字体

此文件列出了将默认用于所有受支持字形的字体系列。每个条目都由一个系列、该系列支持的各种名称以及最多四个字体文件组成。字体文件按其支持的样式的顺序列出:常规、粗体、斜体和粗斜体。如果列出小于四个样式,则没有关联字体文件的样式将由其他列出的字体文件支持。

第一个系列也是默认字体,它处理未指定特定字体名称的字体请求。

任何由系统字体无法处理的字形都会导致搜索备用字体。默认备用字体在文件/system/etc/fallback_fonts.xml中指定,并且供应商可以提供可选文件,在/vendor/etc/fallback_fonts.xml中指定其他备用字体。

如果解析fonts.xml文件,您可以找到哪个字体系列使用哪个字体(请参阅此处):

╔════╦════════════════════════════╦═════════════════════════════╗
║    ║ FONT FAMILY                ║ TTF FILE                    ║
╠════╬════════════════════════════╬═════════════════════════════╣
║  1 ║ casual                     ║ ComingSoon.ttf              ║
║  2 ║ cursive                    ║ DancingScript-Regular.ttf   ║
║  3 ║ monospace                  ║ DroidSansMono.ttf           ║
║  4 ║ sans-serif                 ║ Roboto-Regular.ttf          ║
║  5 ║ sans-serif-black           ║ Roboto-Black.ttf            ║
║  6 ║ sans-serif-condensed       ║ RobotoCondensed-Regular.ttf ║
║  7 ║ sans-serif-condensed-light ║ RobotoCondensed-Light.ttf   ║
║  8 ║ sans-serif-light           ║ Roboto-Light.ttf            ║
║  9 ║ sans-serif-medium          ║ Roboto-Medium.ttf           ║
║ 10 ║ sans-serif-smallcaps       ║ CarroisGothicSC-Regular.ttf ║
║ 11 ║ sans-serif-thin            ║ Roboto-Thin.ttf             ║
║ 12 ║ serif                      ║ NotoSerif-Regular.ttf       ║
║ 13 ║ serif-monospace            ║ CutiveMono.ttf              ║
╚════╩════════════════════════════╩═════════════════════════════╝

有人能解释一下每个TTF文件是如何映射为每个字体族的默认文件的吗?例如,对于sans-serif,为什么使用Roboto-Regular作为TTF文件?我在这个字体族中看到了许多文件。为什么选择这个特定的文件而不是其他文件? - coolDude
好的,我看到您在其他帖子中使用了400作为阈值来确定默认字体。但是为什么是400呢? - coolDude
1
@coolDude,“normal” 的字重值为400。根据 https://www.w3.org/TR/css-fonts-4/#font-weight-absolute-values。 - Vilius Sutkus '89

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接