Android中的默认字体系列是啥?
Posted
技术标签:
【中文标题】Android中的默认字体系列是啥?【英文标题】:What is the default font family in Android?Android中的默认字体系列是什么? 【发布时间】:2017-01-24 22:02:10 【问题描述】:从 API 16 开始,引入了 Jellybean Roboto 作为可用的字体系列。查看 android 16 here 中的“新”功能。
在TextView
上指定android:fontFamily="sans-serif"
(API 16+ 中的Roboto)是TextView
的默认fontFamily
?
是
<TextView
android:layout_
android:layout_ />
相当于
<TextView
android:layout_
android:layout_
android:fontFamily="sans-serif" />
?
来自Material design typography website:
“Roboto 和 Noto 是 Android 和 Chrome 上的标准字体。”
来自Wiki,
“Roboto 是由 Google 开发的无衬线字体系列,作为 其移动操作系统 Android 的系统字体。”
我在文档中没有看到 Android 的默认 fontFamily
是什么。请参阅参考资料:
【问题讨论】:
您输入的两项是等价的。虽然他们不调用sans-serif
Roboto,但它实际上是 Android 中的默认字体系列。
为什么这被否决了?
@Weava 你有支持该文档的链接吗?
不,但 Jared Rummier 给出的答案比我能想到的要好得多 :)
【参考方案1】:
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 同步 进行任何更改,即使框架只会读取此文件。
所有带有ohut 名称的字体都被添加到默认列表中。字体被选中 基于匹配:完整的 BCP-47 语言标签,包括脚本,然后只需 语言,最后是顺序(包含字形的第一个字体)。
出现顺序也是权重匹配的决胜局。这是 Roboto 的 900 个权重在 700 个权重之前的原因 - 我们 当要求 800 重量时,更喜欢前者。由于粗体跨度 有效地增加了 300 的权重,这确保了 900 是粗体 搭配 500 重量,确保足够的对比度。
system_fonts.xml(API 16-20)
系统字体
此文件列出了默认情况下将用于所有受支持字形的字体系列。 每个条目都包含一个系列、该系列支持的各种名称,以及 最多四个字体文件。字体文件按样式的顺序列出 支持:常规、粗体、斜体和粗斜体。如果列出的样式少于四种,则 列出的其他字体文件将支持没有关联字体文件的样式。
第一个family也是默认字体,处理没有指定的字体请求 特定的字体名称。
系统字体未处理的任何字形都将导致搜索备用字体。 默认的备用字体在文件 /system/etc/fallback_fonts.xml 中指定,并且有 是一个可选文件,可能由供应商提供以指定要使用的其他后备字体 在 /vendor/etc/fallback_fonts.xml 中。
如果你解析fonts.xml文件,你可以找到哪个字体家族使用哪个字体(见here):
╔════╦════════════════════════════╦═════════════════════════════╗
║ ║ 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 文件?我看到这个字体系列中列出了许多文件。为什么选择这个特定的而不是其他的?
好的,我看到您使用 400 的权重作为阈值来确定默认字体(查看您在另一篇文章中的代码)。为什么是 400?
@coolDude,“正常”的权重值为 400。根据w3.org/TR/css-fonts-4/#font-weight-absolute-values以上是关于Android中的默认字体系列是啥?的主要内容,如果未能解决你的问题,请参考以下文章