使用可下载字体

尝试使用 Compose 方式
Jetpack Compose 是推荐用于 Android 的界面工具包。了解如何在 Compose 中使用文本。

借助可下载字体功能,API 可向提供程序应用请求获取字体,而无需将文件捆绑到应用或让应用下载字体。可下载字体功能可通过 AndroidX Core 库在搭载 Android API 版本 14 及更高版本的设备上使用。

可下载字体功能具有以下优势:

  • 缩减应用大小,进而提高应用安装成功率。
  • 提升系统的整体运行状况,因为多个应用可通过 提供程序共用同一字体。这样可以帮用户节省移动数据网络流量、手机内存和磁盘空间。在此模型中,系统会在需要时通过网络提取字体。
如需亲身体验可下载字体功能,请参阅 DownloadableFonts 示例应用。

可下载字体的工作方式是怎样的?

字体提供程序是一个应用,可检索字体并将其缓存在本地,以便其他应用可以请求获取和共用字体。下图说明了此过程。

一张图片,显示了表情符号兼容性流程中的主要组件
图 1.可下载字体的使用流程。

基础知识

您可以通过以下方式使用可下载字体功能,后续部分将详细介绍这些方式:

通过 Android Studio 和 Google Play 服务使用可下载字体

您可以使用 Android Studio 3.0 或更高版本将应用设置为下载字体。为帮助您开始使用可下载字体功能,您可以使用 Google Play 服务提供的字体提供程序。

  1. 布局编辑器 中,选择 TextView。然后,在 Attributes 下,选择 fontFamily > More Fonts
    一张图片,显示了 Android Studio 布局编辑器
    图 2.使用 布局编辑器
    系统会显示 Resources 窗口。
  2. Source 菜单中,选择 Google Fonts
  3. Fonts 框中,选择“Downloadable”区域下的字体。
  4. 选择 Create downloadable font ,然后点击 OK
    一张图片,显示了如何从“资源”窗口中选择字体
    图 3.Resources 窗口中选择字体。
  5. Android Studio 会自动生成在您的应用中正确呈现字体所需的相关 XML 文件。

    一张图片,显示了如何预览字体
    图 4.预览字体文件。

以程序化方式使用可下载字体

从 Android 8.0(API 级别 26)开始,AndroidX Core 全面支持可下载字体。如需详细了解如何使用 AndroidX Core 库,请参阅本页面的 可下载字体 AndroidX Core 库部分

如需以程序化方式使用可下载字体功能,请与以下两个关键类互动:

您的应用会使用 FontsContract API 从字体提供程序检索字体。每个提供程序对其支持的 Android 版本和查询语言都有自己的一组限制。如需详细了解 Android 版本和查询格式,请参阅提供程序的相关文档。

如需下载字体,请完成以下步骤:

  1. 创建 android.graphics.fonts.FontRequest 类的实例,以向提供程序请求字体。如需创建请求,请传递以下参数:
    • 字体提供程序的授权。
    • 用于验证提供方身份的字体提供方软件包。
    • 字体的字符串查询。如需详细了解查询格式,请参阅字体 提供程序的相关文档,例如 Google Fonts
    • 用于验证提供方身份的一系列证书哈希集。

    Kotlin

    val request = FontRequest(
            "com.example.fontprovider.authority",
            "com.example.fontprovider",
            "my font",
            certs
    )

    Java

    FontRequest request = new FontRequest("com.example.fontprovider",
                       "com.example.fontprovider", "my font", certs);
  2. 创建 FontsContract.FontRequestCallback 类的实例。
  3. 替换 onTypefaceRetrieved() 方法,以指示字体请求已完成。将检索到的字体作为参数提供。 您可以根据需要使用此方法设置字体。例如,您可以在 TextView 上设置字体。
  4. 替换 onTypefaceRequestFailed() 方法,以接收有关字体请求过程中错误的信息。如需详细了解错误代码,请参阅错误代码常量
  5. 调用 FontsContract.requestFont() 方法,以从字体 提供程序检索字体。该方法会启动检查,以确定缓存中是否存在该字体。如果本地无该字体,则该方法会调用字体提供方,异步检索字体并将结果传递给回调。传递以下参数:
    • 类的实例Context
    • android.graphics.fonts.FontRequest 类的实例
    • 用于接收字体请求结果的回调
    • 用于提取线程上的字体的处理程序

以下示例代码说明了整个可下载字体的使用流程:

Kotlin

val request = FontRequest(
        "com.example.fontprovider.authority",
        "com.example.fontprovider",
        "my font",
        certs
)
val callback = object : FontsContract.FontRequestCallback() {

    override fun onTypefaceRetrieved(typeface: Typeface) {
        // Your code to use the font goes here.
        ...
    }

    override fun onTypefaceRequestFailed(reason: Int) {
        // Your code to deal with the failure goes here.
        ...
    }
}
FontsContract.requestFonts(context, request, handler, null, callback)

Java

FontRequest request = new FontRequest("com.example.fontprovider.authority",
        "com.example.fontprovider", "my font", certs);
FontsContract.FontRequestCallback callback =
    new FontsContract.FontRequestCallback() {
        @Override
        public void onTypefaceRetrieved(Typeface typeface) {
            // Your code to use the font goes here.
            ...
        }

        @Override
        public void onTypefaceRequestFailed(int reason) {
            // Your code to deal with the failure goes here.
            ...
        }
};
FontsContract.requestFonts(context, request, handler, null, callback);

如需详细了解如何从字体提供方下载字体,请参阅 DownloadableFonts 示例应用。

通过 AndroidX Core 使用可下载字体

AndroidX Core 支持在搭载 Android API 版本 14 或更高版本的设备上使用可下载字体功能。androidx.core.provider 软件包中包含 FontsContractCompatFontRequest 类,可实现向后兼容的可下载字体功能支持。AndroidX 类包含与框架方法类似的方法 ,下载字体的过程与本页面上有关 以程序化方式使用可下载字体的部分中所述的过程类似

如需使用 AndroidX 下载字体,请从 androidx.core.provider 软件包导入 FontsContractCompatFontRequest 类。创建这些类(而不是 FontsContractandroid.graphics.fonts.FontRequest 框架类)的实例。

添加 AndroidX Core 依赖项

如需使用 FontsContractCompatFontRequest 类,您必须在开发环境中修改应用项目的类路径依赖项。

如需将 AndroidX Core 添加到应用项目,请将以下依赖项添加到应用的 build.gradle 文件:

Groovy

dependencies {
    ...
    implementation "androidx.core:core-ktx:1.18.0"
}

Kotlin

dependencies {
    ...
    implementation("androidx.core:core-ktx:1.18.0")
}

将可下载字体用作 XML 中的资源

Android 8.0(API 级别 26)和 AndroidX Core 可通过一种更快、更便捷的方式将自定义字体声明为 XML 布局中的资源。这意味着,不再需要将字体捆绑为资源。您可以为整个主题定义一个自定义字体,从而提升多个字重和样式(例如粗体、中等或细体)的可用性。

  1. res/font 文件夹中创建新的 XML 文件。
  2. 添加 <font-family> 根元素并设置与字体相关的属性,如 所示的以下示例 XML 文件:
  3. <?xml version="1.0" encoding="utf-8"?>
    <font-family xmlns:android="http://schemas.android.com/apk/res/android"
            android:fontProviderAuthority="com.example.fontprovider.authority"
            android:fontProviderPackage="com.example.fontprovider"
            android:fontProviderQuery="example font"
            android:fontProviderCerts="@array/certs">
    </font-family>
  4. 在布局 XML 文件中将文件作为 @font/font_file_name 引用。您还可以 使用 getFont() 方法以程序化方式检索文件,例如 getFont(R.font.font_file_name)

在清单中预先声明字体

布局扩充和资源检索是同步任务。默认情况下,第一次尝试检索字体会触发字体提供程序请求,并因此增加第一次布局时间。为避免延迟,您可以预先声明需要在清单中检索的字体。 系统从提供程序检索字体后,该字体会立即可用。如果字体检索时间超出预期,系统会中止提取过程并使用默认字体。

如需在清单中预先声明字体,请完成以下步骤:

  1. res/values/arrays.xml 中创建一个资源数组,并声明要预提取的字体。
  2. res/values/arrays.xml
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <array name="preloaded_fonts">
            <item>@font/font1</item>
            <item>@font/font2</item>
        </array>
    </resources>
  3. 使用 meta-data 标记在清单中声明资源数组。
  4. <meta-data android:name="preloaded_fonts" android:resource="@array/preloaded_fonts" />

添加证书

如果未预安装字体提供程序或您要使用 AndroidX Core 库,请声明为字体提供程序签名所用的证书。系统会使用证书来验证字体提供程序的身份。

通过执行以下步骤来添加证书:

  1. 创建一个包含证书详情的字符串数组。如需详细了解证书 详细信息,请参阅字体提供程序的相关文档。
  2. <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string-array name="certs">
           <item>MIIEqDCCA5CgAwIBAgIJA071MA0GCSqGSIb3DQEBBAUAMIGUMQsww...</item>
        </string-array>
    </resources>
  3. fontProviderCerts 属性设置为该数组。
  4. android:fontProviderCerts="@array/certs"

Compose 中的可下载字体