Android 8.0 新特性(一)

来源:互联网 发布:网络女作家排行榜2016 编辑:程序博客网 时间:2024/05/23 05:09


原文地址: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"

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

原创粉丝点击