如果你想要操作字体,无论是使用 Android 系统自带的字体,还是加载自己内置的 .ttf(TureType) 或者 .otf(OpenType) 格式的字体文件,你都需要使用到 Typeface 这个类。因此我们要全局修改字体,首先就要把 Typeface 给弄明白
二、Typeface 源码分析
源码分析环节可能比较枯燥,坚持就是胜利 ⛽️
1、Typeface 初始化
Typeface 这个类会在 Android 应用程序启动的过程中,通过反射的方式被加载。点击源码可以看到它里面有一个 static 代码块,它会随着类的加载而加载,并且只会加载一次,Typeface 就是通过这种方式来进行初始化的,如下:
static {
//创建一个存放字体的 Map
final HashMap<String, Typeface> systemFontMap = new HashMap<>();
//将系统的一些默认字体放入 Map 中
initSystemDefaultTypefaces(systemFontMap,SystemFonts.getRawSystemFallbackMap(),SystemFonts.getAliases());
//unmodifiableMap 方法的作用就是将当前 Map 进行包装,返回一个不可修改的Map,如果调用修改方法就会抛异常
sSystemFontMap = Collections.unmodifiableMap(systemFontMap);
// We can’t assume DEFAULT_FAMILY available on Roboletric.
/**
- 设置系统默认字体 DEFAULT_FAMILY = “sans-serif”;
- 因此系统默认的字体就是 sans-serif
*/
if (sSystemFontMap.containsKey(DEFAULT_FAMILY)) {
setDefault(sSystemFontMap.get(DEFAULT_FAMILY));
}
// Set up defaults and typefaces exposed in public API
//一些系统默认的字体
DEFAULT = create((String) null, 0);
DEFAULT_BOLD = create((String) null, Typeface.BOLD);
SANS_SERIF = create(“sans-serif”, 0);
SERIF = create(“serif”, 0);
MONOSPACE = create(“monospace”, 0);
//初始化一个 sDefaults 数组,并预加载好粗体、斜体等一些常用的 Style
sDefaults = new Typeface[] {
DEFAULT,
DEFAULT_BOLD,
create((String) null, Typeface.ITALIC),
create((String) null, Typeface.BOLD_ITALIC),
};
//…
}
上述代码写了详细的注释,我们可以发现,Typeface 初始化主要做了:
1、将系统的一些默认字体放入一个 Map 中
2、设置默认的字体
3、初始化一些默认字体
4、初始化一个 sDefaults 数组,存放一些常用的 Style
完成了 Typeface 的初始化,接下来看 Typeface 提供了一系列创建字体的 API ,其中对上层开放调用的有如下几个:
下面我们来重点分析这几个方法
2、通过 Typeface 和 Style 获取新的 Typeface
对应上面截图的第一个 API , 看下它的源码:
public static Typeface create(Typeface family, &#