原文地址: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() {@Overridepublic void onTypefaceRetrieved(Typeface typeface) {// Your code to use the font goes here...}@Overridepublic 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"
    

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

Android 8.0 新特性(一) - 可下载字体相关推荐

  1. Android 4.0新特性(中文)

    Android 4.0新特性(中文) 转自http://www.eoeandroid.com/thread-103300-1-1.html android4.0 SDK发布有一段时间了,在eoe上找到 ...

  2. 安卓9.0发布,献上Android 9.0新特性适配处理

    安卓9.0即Android 9.0已经面向全球发布,它的代号是Pie,仍然基于Linux内核构建.为了避免Android 9.0 Pie新特性更新引发的适配问题,本文将介绍Android 9.0将带来 ...

  3. android 5.0 新功能,Android 5.0新特性有哪些?安卓5.0新功能汇总

    Android 5.0新特性有哪些?经过一段时间曝光与测试后,期待已久的Android L系统正式发布了,新一代安卓系统正式名称为Android 5.0 Lollipop(棒棒糖).Android 5 ...

  4. Android RecyclerView(五)封装Holder与Adapter(Android 5.0 新特性)

    Android RecyclerView(五)封装Holder与Adapter(Android 5.0 新特性) 1 效果 2 BaseHolder的封装 public class BaseViewH ...

  5. RecyclerView(四)设置分割线样式(Android 5.0 新特性)

    Android RecyclerView(四)设置分割线样式(Android 5.0 新特性) 样式一 在这里,其实是设置了每一个 条目布局中的子布局的android:layout_margin = ...

  6. RecyclerView(三)实现聊天窗口样式(Android 5.0 新特性)

    Android RecyclerView(三)实现聊天窗口样式(Android 5.0 新特性) 效果 1 聊天窗口子视图布局文件 1.1 左边消息视图布局文件 使用到的背景图片 <?xml v ...

  7. RecyclerView(一)综合使用综述(Android 5.0 新特性)

    Android RecyclerView(一)综合使用综述(Android 5.0 新特性) RecyclerView是support.v7包中的控件,可以说是ListView和GridView的增强 ...

  8. 开发者必看|Android 8.0 新特性及开发指南

    背景介绍 谷歌2017I/O开发者大会今年将于5月17-19日在美国加州举办.大会将跟往年一样发布最新的 Android 系统,今年为 Android 8.0.谷歌在今年3 月21日发布 Androi ...

  9. Android 7.0 新特性

    注:本文是从谷歌官网翻译过来的,放这里便于查阅和消化理解,更多详细知识点请自备梯子访问官网~ API 级别:24 代号:N Android 7.0 Nougat 为用户和开发者引入多种新功能.本文重点 ...

  10. Android 6.0新特性

    注:本文是从谷歌官网翻译过来的,放这里便于查阅和消化理解,更多详细知识点请自备梯子访问官网~ Android 6.0(API 级别 23)除了提供诸多新特性和功能外,还对系统和 API 行为做出了各种 ...

最新文章

  1. linux命令vgdisplay提示权限不足,linux常用命令总结
  2. 穹顶下业务流程管理失位
  3. 在Android Studio上进行OpenCV 3.1开发
  4. python新手菜鸟之基础篇
  5. 服务器可以pyqt显示吗,用pyqt+socket实现远程操作服务器的一个例子,PyQtsocket,方法,示例...
  6. typescript入门简明教程
  7. 新能源补贴退坡 广汽新能源、比亚迪不涨价 蔚来最狠!
  8. Matlab程序——修正鲍威尔Powell法
  9. Linux中c语言strcmp,c语言常用函数strcmp函数和strcpy函数
  10. kudu底层存储引擎的数据组织方式
  11. 用html制作粒子线条,html5 canvas跟随鼠标粒子线条动画特效
  12. 空间四点定位原理及应用
  13. Pocket PC 2003 PC网卡上网设置
  14. 怎样使用Markdown输入数学公式
  15. 【转】Maximal Information Coefficient (MIC)最大互信息系数详解与实现
  16. Ubuntu20.04安装中国版firefox
  17. Android开发中的Log打印日志
  18. 分享一个技术知识类电子书网站
  19. 黄河科技学院计算机应用技术在哪个校区,黄河科技学院成考计算机应用技术(高升专)专业_黄河科技学院成考报名_成考计算机应用技术专业就业方向_中国教育在线...
  20. 3ds max法线贴图制作流程

热门文章

  1. 在JMP中拆分数据集有烦恼?这些实用妙招试试看!
  2. 如何实现电脑端和手机端数据传输与共享
  3. 码栈——让一切变得自动化
  4. Linux下批量tiff转pdf
  5. ASIO音频驱动开发指南 2.0
  6. build lavas 失败_构建配置 - Lavas 教程
  7. 远程会诊系统加持,长三角(上海)智慧互联网医院有多智慧?
  8. maven自动部署到tomcat9
  9. layui树形表格treetable
  10. Python暴力破解WIFI(超详细破解教程+UI设计教程+步步解析)