使用可下载字体

试用 Compose 方式
Jetpack Compose 是推荐在 Android 设备上使用的界面工具包。了解如何在 Compose 中使用文本。
<ph type="x-smartling-placeholder"></ph> 可下载字体 →
<ph type="x-smartling-placeholder">

“可下载字体”功能允许 API 从提供程序应用(而非 将文件捆绑到应用中,或让应用下载字体。以下网页提供可下载字体: 运行 Android API 版本 14 及更高版本且通过 AndroidX Core 库运行的设备。

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

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

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

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

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

基础知识

您可以通过以下方式使用可下载字体功能,具体方式将详细介绍 :

在 Android Studio 和 Google Play 服务中使用可下载字体

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

<ph type="x-smartling-placeholder">
  1. 布局编辑器中,选择一个 TextView。然后,在属性下: 选择 fontFamily >更多字体。 <ph type="x-smartling-placeholder">
    </ph> 显示 Android Studio 布局编辑器的图片 <ph type="x-smartling-placeholder">
    </ph> 图 2.使用布局编辑器
    系统随即会显示 Resources 窗口。
  2. Source 菜单中,选择 Google Fonts
  3. 字体框中,从“可下载”下方选择一种字体。区域。
  4. 选择创建可下载字体,然后点击确定。 <ph type="x-smartling-placeholder">
    </ph> 一张图片,显示如何从“Resources”窗口选择字体 <ph type="x-smartling-placeholder">
    </ph> 图 3.Resources 窗口中选择字体。
  5. Android Studio 会自动生成渲染字体所需的相关 XML 文件 。

    <ph type="x-smartling-placeholder">
    </ph> 显示如何预览字体的图片 <ph type="x-smartling-placeholder">
    </ph> 图 4.预览字体文件。

以编程方式使用可下载字体

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

要以编程方式使用可下载字体功能,需要与以下两个关键类进行交互:

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

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

  1. 创建 android.graphics.fonts.FontRequest 类的实例以请求 字体。如需创建请求,请传递以下参数: <ph type="x-smartling-placeholder">
      </ph>
    • 字体提供程序的授权。
    • 用于验证提供程序身份的字体提供程序软件包。
    • 字体的字符串查询。如需详细了解查询格式,请查看您的字体 提供商的文档,例如 Google Fonts
    • 用于验证提供程序身份的一系列证书哈希集。 <ph type="x-smartling-placeholder">

    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);
    
    <ph type="x-smartling-placeholder">
  2. 创建 FontsContract.FontRequestCallback 类。
  3. 替换 onTypefaceRetrieved() 方法,以指示字体请求已完成。将检索到的字体作为参数提供。 您可以根据需要使用此方法设置字体。例如,您可以将字体设置为 TextView
  4. 替换 onTypefaceRequestFailed() 方法,以接收有关字体请求过程中的错误的信息。更多信息 请参阅 错误代码常量
  5. 调用 FontsContract.requestFont() 方法从字体中检索字体 提供商。该方法会启动检查,以确定缓存中是否存在该字体。如果 如果字体不在本地,则会调用字体提供程序, 异步执行,并将结果传递给回调。传递以下参数: <ph type="x-smartling-placeholder">
      </ph>
    • Context
    • android.graphics.fonts.FontRequest 类的实例
    • 用于接收字体请求结果的回调
    • 用于在线程上获取字体的处理程序
    • <ph type="x-smartling-placeholder">

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

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 下载字体,请导入 FontsContractCompatandroidx.core.provider 软件包中的 FontRequest 类。创建 这些类的实例,而不是 FontsContractandroid.graphics.fonts.FontRequest 框架类。

<ph type="x-smartling-placeholder">

添加 AndroidX Core 依赖项

如需使用 FontsContractCompatFontRequest 类,您必须修改 应用项目的类路径依赖项。

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

Groovy

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

Kotlin

dependencies {
    ...
    implementation("androidx.core:core-ktx:2.2.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 库,则声明 字体提供程序在签名时使用的证书。系统使用证书来验证 字体提供程序的身份。

<ph type="x-smartling-placeholder">

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

  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 中的可下载字体

距离开始还有 Compose 1.2-alpha07, 可以使用 Compose 应用中的 Downloadable Fonts API 来下载 异步使用 Google Fonts,在您的应用中使用它们。对于 请参阅 Compose 可下载字体文档。