Android 字体加载

本文详细介绍了Android系统中字体的加载过程,包括Font配置文件的结构,如system_fonts.xml和fallback_fonts.xml,以及字体加载的流程。在zygote初始化时,Typeface类会通过JNI调用skia库加载字体。解析XML文件后,信息存储在gSystemFonts中,进一步创建并保存到FamilyRec链表。此外,文章还讨论了默认字体和字体族的设置。
摘要由CSDN通过智能技术生成

1.      Font配置文件

    位于frameworks/base/data/fonts

    system_fonts.xml  fallback_fonts.xml

 

文件结构

    <family>

        <nameset>

            <name>sans-serif</name>

            <name>arial</name>

            <name>helvetica</name>

            <name>tahoma</name>

            <name>verdana</name>

        </nameset>

        <fileset>

            <file>Roboto-Regular.ttf</file>

            <file>Roboto-Bold.ttf</file>

            <file>Roboto-Italic.ttf</file>

            <file>Roboto-BoldItalic.ttf</file>

        </fileset>

    </family>

 

可以称每一个 family为一个字体族。 包括:正常字体,粗体,斜体,粗体斜体,每个家族包括四种字体,这四种字体不是都必须的。

2.      字体加载

zygote初始化时preloadclass会加载Typeface类,在这个类中会调用jni-->skia 加载字体。

 

(1)一些数据类型,加载字体解析xml文件,保存到这些数据结构中。

 

structFontFamily {                           --->  family
    SkTDArray<const char*>   fNames;        --->   name     ---> gDefaultNames
    SkTDArray<FontFileInfo*>fFontFileArray;     --->  file       ---> gSystemFonts
    int order;
};

 

FontFamily可以理解为字体族,对应一个<family>标签。

SkTDArray<constchar*>   fNames 保存了<name>字段。

SkTDArray<FontFileInfo*>fFontFileArray 保存了<file>。

 

一个SkTDArray<FontFamily*>,可以保存整个xml文件信息。

structFontFileInfo {
    FontFileInfo() : fFileName(NULL),fVariant(SkPaint::kDefault_Variant),
            fLanguage() {
    }
    const char*          fFileName;
    SkPaint::FontVariant fVariant;
    SkLanguage           fLanguage;
};


FontFileInfo包含了三个字段,fFileName代表标签<file>里的字体文件名字;file 可以有属性 variant="elegant" 和 lang="ja&#

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值