Android 8.0 新特性 可下载字体 开发文档

Android 8.0 新特性 可下载字体 开发文档

原文:Downloadable Fonts

译按:在Android O发布Developer Preview之后,我介绍了关于后台限制等一些行为和API,发布在了b站。这一版本的Android看似没有什么改变,但实际上是对厂商做出了一系列规范,同时也给予了在合理范围内的可定制。虽然目前屏幕显示技术已不再对文字显示造成很大困扰,但电子设备上的文字处理现状并不乐观。今年的Atypl上,关于亚洲字体授权问题中提及,中国大陆移动设备上的字体业务收益颇丰。虽然开发者不一定需要阅读本地化开发文档,不过我的希望只是这一话题引起关注。如果看完了觉得有点意思,不妨通过文中链接去下一个示例应用在Android Studio试一试。


Android 8.0 (API 26) 和Android支持库26支持API从字体提供程序(Font Provider)中请求字体,而无需将字体绑定到 APK 中或让 APK 下载字体。这一功能通过支持库26在Android API 14及其更高的版本中运行。

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

  • 减少APK的大小
  • 提高应用安装成功率
  • 多个应用通过一个提供程序可以共享同一种字体,从而提升了整个系统的健康。如此可节省用户的数据流量、手机内存以及存储空间。此模式下字体文件会在需要时通过网络获取。

可下载字体是如何工作的?

字体提供程序是一个可以获取字体并缓存到本地以便其他应用可以请求和共享字体的应用程序。

image.png
可下载字体流程图

基础

您可以通过下列方式使用可下载字体功能:

  • 通过 Android Studio 和 Google Play 服务使用可下载字体。
  • 通过编程使用可下载字体。
  • 通过支持库使用可下载字体。

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

你可以使用Android Studio 3.0设置你的应用下载字体。为方便开始使用可下载字体功能,你可以使用Google Play服务中的字体提供程序。

注意:使用Google字体提供程序的设备须具有Google Play服务11版或更高版本。

  1. Layout Editor中,选择一个TextView,然后在Propertie下,选择fontFamily > More Fonts
image.png
使用Layout edit

出现Resources窗口。

  1. Source下拉列表中,选择Google Fonts

  2. Fonts框中,选择一种字体。

  3. 选择Create downloadable font,然后单击OK

注意:选择Add font to project在应用中绑定字体。

image.png
在Resources窗口中选择字体

Android Studio自动生成在应用中正确显示字体所需相应的XML文件。

image.png
预览字体文件

通过编程使用可下载字体

Android 8.0(API level 26)之前的版本中,支持库26.0对可下载字体提供完全支持。 更多关于支持库的信息,参阅通过支持库使用可下载字体的章节。

通过编程使用可下载字体功能,你需要同两个关键类进行交互:

android.graphics.fonts.FontRequest:此类允许你创建一个字体请求。

[FontsContract](https://developer.android.com/reference/android/provider/FontsContract.html):此类允许你创建一个基于字体请求的Typeface对象。

应用通过FontsContractAPI从字体提供程序检索字体。 每个提供程序对其支持的Android版本和查询语言都有自己的限制。 更多关于Android版本和查询格式的信息,请参阅你的提供程序的文档。

执行以下步骤下载字体:

1. 创建一个android.graphics.fonts.FontRequest类的实例以请求提供程序的字体。通过以下参数创建请求:

  • 字体提供程序权限
  • 用于验证提供程序的身份的字体提供程序包
  • 字体查询字符串。更多有关查询格式的信息,请参阅字体提供程序文档,如Google Fonts
  • 用于验证提供程序身份的证书的散列字体提供程序权限的集合列表。

注意:若从预装提供程序请求字体则无需要添加证书,但若通过支持库请求字体则必须始终提供证书。

FontRequest request \= new FontRequest("com.example.fontprovider", "com.example.fontprovider", "my font", certs);

注意:你可以从字体提供程序接收参数值,Android Studio自动为其UI中支持的提供程序填充这些值。

2. 创建一个FontsContract.FontRequestCallback类实例。

  1. 覆盖onTypefaceRetrieved()方法以指示字体请求完成。提供获取的字体则作为参数。你可以根据需要使用此方法设置字体,比如设置TextView的字体。

  2. 覆盖onTypefaceRequestFailed()方法以接收有关字体请求过程中的错误信息。更多有关错误代码的信息,可参阅错误代码常量

  3. 调用FontsContract.requestFont()方法以从字体提供程序中获取字体。此方法启动检查以确认字体是否存在于缓存中。若字体本地不可用,则调用字体提供程序,异步获取字体,并回调结果。根据以下参数:

  • 一个Context类实例
  • 一个android.graphics.fonts.FontRequest类实例
  • 一个接收字体请求结果的回调
  • 一个获取线程上字体的Handler

注意:确保此Handler非UI线程Handler。

以下示例代码演示了可下载字体处理过程:

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, callback , handler);

更多关于如何从字体提供程序下载字体的信息,可参阅可下载字体示例应用

通过支持库使用可下载字体

支持库26对运行Android API 14或更高版本的设备提供可下载字体功能的支持。FontsContractCompatFontRequest类包含于android.support.v4.provider包中,以实现对可下载字体功能支持的向后兼容。支持库的类包含方法类似于框架,下载字体的处理类似于下载字体章节中的。

android.support.v4.provider包导入FontsContractCompatFontRequest类即可使用支持库下载字体。创建这些类的实例,而非FontsContractandroid.graphics.fonts.FontRequest框架类。

注意:当你通过支持库请求字体时必须提供证书,包括预安装的字体提供程序。

添加支持库依赖关系

为使用FontsContractCompatFontRequest类,你需要在开发环境中修改应用项目的类路径依赖关系。

添加支持库到你的应用项目中:

  1. 打开你应用中的build.gradle文件。
  2. 添加支持库到dependencies部分。
dependencies {  ... compile "com.android.support:support-compat:26.1.0"
}

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

Android 8.0 (API 26) 和支持库26为在声明作为XML Layout中资源的自定义字体提供了一种更快更便捷的方式。这意味着不需要将字体绑定为asset,你可以为整个主题自定义字体,以提供多种字重和样式,如Bold、Medium或Light。

    1. res/font文件夹中创建一个新的XML文件
    2. 添加<font-family>根元素,并设置与以下示例XML文件所示的字体相关属性:
<?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>
  1. 参阅layout XML文件中的@font/font_file_name文件,你也可以使用getFont()方法以编程获取文件,如getFont(R.font.font_file_name)

在manifest中预声明字体

Layout inflation和资源检索是同步任务。默认情况下,首次尝试检索字体会触发对字体提供程序的请求,从而造成第一个Layout延迟。为避免延迟,你可以在manifest中预声明需要检索的字体。系统从提供程序中检索字体后可立即使用。如果字体检索时间比预期要长,系统将中止提取过程,并使用默认字体。

执行以下步骤在manifest中预声明字体:

    1. res/values/arrays.xml中创建一个资源数组,并声明要预读的可下载字体。
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\>
  1. 使用vmeta-data标签在manifest中声明资源数组。
<meta-data android:name\="preloaded\_fonts" android:resource\="@array/preloaded\_fonts" />

添加证书

若未预装字体提供程序或你使用支持库,那么必须声明字体提供程序签名的证书,系统使用证书验证字体提供程序的身份。

注意 :如果你在Android Studio中使用字体选择器工具,Android Studio可以自动填充Google Play服务提供程序的值。 更多有关使用Android Studio下载字体的内容,可参阅通过Android Studio和Google Play服务使用可下载字体的章节。

执行以下步骤添加证书:

  1. 创建具有证书详细信息的字符串数组。更多有关证书的信息,请参阅你的字体提供程序的具体文档。
<?xml version\="1.0" encoding\="utf-8"?>
        <resources>  <string-array name\="certs"\> <item>MIIEqDCCA5CgAwIBAgIJA071MA0GCSqGSIb3DQEBBAUAMIGUMQsww...</item>  </string-array>
        </resources>
  1. 设置fontProviderCerts属性到数组。
android:fontProviderCerts\="@array/certs"

注意:如果提供程序有不止一个证书集,你可定义一 个字符串数组的数组。


Some rights reserved
Except where otherwise noted, content on this page is licensed under a Creative Commons Attribution 4.0 International license