Android 8.0 新特性(一) - 可下载字体


原文地址:Downloadable Fonts

Demo地址:SupportDemo

Android 8.0(API 26)和Android Support 26引入了使用由应用程序提供的字体的API支持,而不是将字体文件捆绑到APK或让APK下载字体。 该支持库最低使用版本为API 24.

可下载的字体特性具有以下优点:

  • 减少APK的大小
  • 提高应用安装成功率
  • 通过多个APK共享提供商相同的字体来提高整体系统的运行性能。这样可以节省用户蜂窝数据,手机内存和磁盘空间。在这个模型中,需要时通过网络获取字体。

可下载字体如何工作?

字体提供程序是一种检索字体并将其缓存在本地的应用程序,以便其他应用程序可以请求和共享字体。

这里写图片描述

如何使用可下载字体

使用可下载字体特性的方式:

  • Android Studio和Google Play服务
  • 编程方式
  • 支持库
Android Studio和Google Play服务

可以使用Android Studio 3.0设置应用程序下载字体。为了帮助开始使用可下载的字体特性,可以使用Google Play服务的字体提供程序。

注意:设备必须具有Google Play的11以上版本的服务才能使用Google字体提供程序。

  1. 在Layout Editor中,选择一个TextView,然后在Attributes窗口中, 选择fontFamily > More Fonts,出现了字体Resources窗口

  2. 在字体Resources窗口中选择 Google Fonts
  3. 选择可下载的字体 并点击”ok”

    要将字体打包到应用程序中,选择添加字体到项目。

Android Studio会自动生成在应用程序中正确显示字体所需的相关XML文件:

这里写图片描述

编程方式

在Android 8.0(API 26)之前SDK版本,支持库26.0提供对可下载字体的完全支持。

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

  • android.graphics.fonts.FontRequest: 此类用于创建字体请求
  • FontsContract: 此类用于根据字体请求创建一个新的Typeface对象

应用程序使用FontsContract API从字体提供程序检索字体。每个字体提供程序对其支持的Android版本和查询语言类型都有自身的限制。

如果要下载字体,按以下步骤执行:

  1. 创建一个android.graphics.fonts.FontRequest类的实例来请求字体提供程序的字体。 要创建请求,需要传递以下参数:

    • 字体提供程序的权限
    • 字体提供程序包,以验证字体提供程序的身份
    • 字体的字符串查询。有关查询格式的更多信息,可以参阅字体提供程序的文档,如Google字体。
    • 证书的一组哈希表,用于验证提供程序的身份证书的一组哈希表

      注意:如果从预先安装的提供程序请求字体,则不需要添加证书。 但是,如果通过支持库请求字体,则必须始终提供证书。

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

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

  2. 创建FontsContract.FontRequestCallback实例
  3. 重写onTypefaceRetrieved()方法,以表明字体请求完成。提供检索的字体作为其参数。可以根据需要使用此方法设置字体。 例如,可以在TextView上设置字体
  4. 重写onTypefaceRequestFailed()方法,来处理有关字体请求过程中的错误的信息。有关错误代码的更多信息,可以参阅错误代码常量。
  5. 调用FontsContract.requestFont()方法从字体提供程序中检索字体。该方法启动一个检查,以确定该字体是否存在于缓存中。如果字体在本地不可用,它会调用字体提供程序,异步检索字体,并将结果传递给回调。需要传递以下参数:

    • Context实例
    • android.graphics.fonts.FontRequest实例
    • 一个回调(FontsContract.FontRequestCallback)来处理字体请求的结果
    • 一个处理在线程中获取到字体的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);   

Demo github地址: Downloadable Fonts sample app

支持库

Support 26支持设备运行可下载字体特性,最低API版本为14。android.support.v4.provider包包含FontsContractCompat和FontRequest类,以实现向后兼容的可下载字体特性支持。支持库类包含与框架类似的方法。下载字体的过程也类似于编程方式使用可下载字体特性所涉及到的。

注意:当通过支持库请求字体时,必须提供证书。 即使对于预先安装的字体提供应用程序也是如此。

要使用支持库下载字体特性,需要导入android.support.v4.provider包中的FontsContractCompat和FontRequest类。创建这些类的实例,而不是框架中的FontsContract和android.graphics.fonts.FontRequest类。

添加支持库依赖关系

要使用FontsContractCompat和FontRequest类,必须在应用程序项目的添加类的依赖关系。

要在应用程序项目中添加支持库,app中的build.gradle中:

dependencies {
    ...
    compile "com.android.support:support-compat:26.1.0"
}
使用可下载的字体作为XML中的资源

在Android 8.0(API 26)和Support 26提供了一种将自定义字体声明为XML布局中的资源的更快更方便的方式。这意味着,不需要将字体文件添加到App。 可以为整个主题定义自定义字体,这样可以提供多种大小和样式(如Bold, Medium,或者Light)的可用性。

  1. 在res / font文件夹中创建一个新的XML文件
  2. 添加根元素,并设置与以下示例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>
    
    • android:fontProviderAuthority:字体提供程序的权限
    • android:fontProviderPackage:字体提供程序包,以验证字体提供程序的身份
    • android:fontProviderQuery:字体的字符串查询。有关查询格式的更多信息,可以参阅字体提供程序的文档,如Google字体。
    • android:fontProviderCerts:证书的一组哈希表,用于验证提供程序的身份证书的一组哈希表
  3. 在布局XML文件中将该文件称为@font/font_file_name。还可以使用getFont()方法以编程方式检索文件。例如,

    getFont(R.font.font_file_name)
    
在Manifest中预先声明字体

LayoutInflater和资源搜索是同步任务。默认情况下,首次尝试检索字体会触发对提供字体的应用程序的请求,从而增加了第一个布局绘制时间。 为了避免延迟,可以在Manifest中预先声明需要检索的字体。系统从提供程序中检索字体后,可立即使用。如果字体检索时间比预期的长,系统将终止提取字体并使用默认字体。

要在Menifest中预先声明字体,请执行以下步骤:

  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>
    
  2. 使用meta-data标签在清单中声明资源数组。

    <meta-data android:name="preloaded_fonts" android:resource="@array/preloaded_fonts" />
    
添加证书

当字体提供程序未预先安装或使用支持库时,必须声明字体提供程序签名的证书。 系统使用证书来验证字体提供程序的身份。

注意:如果在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>
    
  2. 将fontProviderCerts属性设置为字符串数组。

    android:fontProviderCerts="@array/certs"
    

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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值