可下载字体功能允许 API 从提供程序应用程序请求字体,而不是将文件捆绑到应用程序中或让应用程序下载字体。可下载字体在运行 Android API 版本 14 及更高版本的设备上通过 AndroidX Core 库提供。
可下载字体提供以下优势
- 减小应用程序大小,从而提高应用程序安装成功率。
- 改善整体系统健康状况,因为多个应用程序可以通过提供程序共享同一字体。这为用户节省了蜂窝数据、手机内存和磁盘空间。在此模型中,字体在需要时通过网络获取。
可下载字体的工作原理是什么?
字体提供程序是一个检索字体并将其缓存在本地以便其他应用程序可以请求和共享字体的应用程序。下图说明了此过程。
基础知识
您可以通过以下方式使用可下载字体功能,这些方式将在后面的部分中详细介绍
使用 Android Studio 和 Google Play 服务使用可下载字体
您可以使用 Android Studio 3.0 或更高版本将您的应用程序设置为下载字体。为了帮助您开始使用可下载字体功能,您可以使用来自 Google Play 服务的字体提供程序。
- 在布局编辑器中,选择
TextView
。然后,在属性下,选择fontFamily > 更多字体。资源窗口出现。 - 在源菜单中,选择Google 字体。
- 在字体框中,选择“可下载”区域下的字体。
- 选择创建可下载字体,然后单击确定。
Android Studio 会自动生成在您的应用中正确呈现字体的相关 XML 文件。
以编程方式使用可下载字体
从 Android 8.0(API 级别 26)开始,AndroidX Core 提供了对可下载字体的全面支持。有关使用 AndroidX Core 库的更多信息,请参阅此页面上的 可下载字体 AndroidX Core 库部分。
要以编程方式使用可下载字体功能,请与两个关键类进行交互
android.graphics.fonts.FontRequest
:此类允许您创建字体请求。FontsContractCompat
:此类允许您根据字体请求创建新的Typeface
对象。
您的应用通过使用 FontsContract
API 从字体提供程序检索字体。每个提供程序都对其支持的 Android 版本和查询语言有一套自己的限制。有关 Android 版本和查询格式的更多信息,请参阅您的提供程序的文档。
要下载字体,请完成以下步骤
- 创建
android.graphics.fonts.FontRequest
类的实例以从提供程序请求字体。要创建请求,请传递以下参数- 字体提供程序权限。
- 字体提供程序包以验证提供程序的身份。
- 字体的字符串查询。有关查询格式的更多信息,请参阅您的字体提供程序的文档,例如 Google 字体。
- 用于验证提供程序身份的证书的一组散列的列表。
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);
- 创建
FontsContract.FontRequestCallback
类的实例。 - 覆盖
onTypefaceRetrieved()
方法以指示字体请求已完成。将检索到的字体作为参数提供。您可以使用此方法根据需要设置字体。例如,您可以设置TextView
上的字体。 - 覆盖
onTypefaceRequestFailed()
方法以接收有关字体请求过程中错误的信息。有关错误代码的更多信息,请参阅 错误代码常量。 - 调用
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
包包含 FontsContractCompat
和 FontRequest
类以实现向后兼容的可下载字体功能支持。AndroidX 类包含与框架方法类似的方法,并且下载字体的过程类似于此页面上关于 以编程方式使用可下载字体 的部分中描述的过程。
要使用 AndroidX 下载字体,请从 androidx.core.provider
包导入 FontsContractCompat
和 FontRequest
类。创建这些类的实例,而不是 FontsContract
和 android.graphics.fonts.FontRequest
框架类。
添加 AndroidX Core 依赖项
要使用 FontsContractCompat
和 FontRequest
类,您必须在开发环境中修改应用项目的类路径依赖项。
要将 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 布局中声明自定义字体作为资源。这意味着无需将字体捆绑为资产。您可以为整个主题定义自定义字体,这在提供多个粗细和样式(如粗体、中粗体或细体)时会加快可用性。
- 在
res/font
文件夹中创建一个新的 XML 文件。 - 添加
<font-family>
根元素并设置与字体相关的属性,如以下示例 XML 文件所示 - 在布局 XML 文件中将文件引用为
@font/font_file_name
。您还可以使用getFont()
方法以编程方式检索文件,例如getFont(R.font.font_file_name)
。
<?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>
在清单中预先声明字体
布局膨胀和资源检索是同步任务。默认情况下,第一次尝试检索字体会触发对字体提供程序的请求,从而增加第一次布局时间。为了避免延迟,您可以预先声明需要在清单中检索的字体。系统从提供程序检索字体后,它会立即可用。如果字体检索花费的时间超过预期,系统将中止获取过程并使用默认字体。
要在清单中预先声明字体,请完成以下步骤
- 在
res/values/arrays.xml
中创建一个资源数组,并声明要预取的字体。 - 使用
meta-data
标记在清单中声明资源数组。
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>
<meta-data android:name="preloaded_fonts" android:resource="@array/preloaded_fonts" />
添加证书
当字体提供程序未预安装或您使用 AndroidX Core 库时,请声明字体提供程序签名的证书。系统使用这些证书来验证字体提供程序的身份。
执行以下步骤以添加证书
- 创建一个包含证书详细信息的字符串数组。有关证书详细信息的更多信息,请参阅您的字体提供商的文档。
- 将
fontProviderCerts
属性设置为数组。
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="certs"> <item>MIIEqDCCA5CgAwIBAgIJA071MA0GCSqGSIb3DQEBBAUAMIGUMQsww...</item> </string-array> </resources>
android:fontProviderCerts="@array/certs"
Compose 中的可下载字体
从Compose 1.2-alpha07开始,您可以在 Compose 应用中使用可下载字体 API 异步下载Google 字体并在应用中使用它们。有关更多信息,请参阅Compose 可下载字体文档。