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字体提供程序。
在Layout Editor中,选择一个TextView,然后在Attributes窗口中, 选择fontFamily > More Fonts,出现了字体Resources窗口
- 在字体Resources窗口中选择 Google Fonts
选择可下载的字体 并点击”ok”
要将字体打包到应用程序中,选择添加字体到项目。
Android Studio会自动生成在应用程序中正确显示字体所需的相关XML文件:
编程方式
在Android 8.0(API 26)之前SDK版本,支持库26.0提供对可下载字体的完全支持。
要以编程方式使用可下载的字体特性,需要与两个关键类进行交互:
- android.graphics.fonts.FontRequest: 此类用于创建字体请求
- FontsContract: 此类用于根据字体请求创建一个新的Typeface对象
应用程序使用FontsContract API从字体提供程序检索字体。每个字体提供程序对其支持的Android版本和查询语言类型都有自身的限制。
如果要下载字体,按以下步骤执行:
创建一个android.graphics.fonts.FontRequest类的实例来请求字体提供程序的字体。 要创建请求,需要传递以下参数:
- 字体提供程序的权限
- 字体提供程序包,以验证字体提供程序的身份
- 字体的字符串查询。有关查询格式的更多信息,可以参阅字体提供程序的文档,如Google字体。
证书的一组哈希表,用于验证提供程序的身份证书的一组哈希表
注意:如果从预先安装的提供程序请求字体,则不需要添加证书。 但是,如果通过支持库请求字体,则必须始终提供证书。
FontRequest request = new FontRequest("com.example.fontprovider","com.example.fontprovider", "my font", certs);
注意:可以从字体提供程序接收参数值。 Android Studio会自动为其UI中支持的提供商填充这些值。
- 创建FontsContract.FontRequestCallback实例
- 重写onTypefaceRetrieved()方法,以表明字体请求完成。提供检索的字体作为其参数。可以根据需要使用此方法设置字体。 例如,可以在TextView上设置字体
- 重写onTypefaceRequestFailed()方法,来处理有关字体请求过程中的错误的信息。有关错误代码的更多信息,可以参阅错误代码常量。
调用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)的可用性。
- 在res / font文件夹中创建一个新的XML文件
添加根元素,并设置与以下示例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:证书的一组哈希表,用于验证提供程序的身份证书的一组哈希表
在布局XML文件中将该文件称为@font/font_file_name。还可以使用getFont()方法以编程方式检索文件。例如,
getFont(R.font.font_file_name)
在Manifest中预先声明字体
LayoutInflater和资源搜索是同步任务。默认情况下,首次尝试检索字体会触发对提供字体的应用程序的请求,从而增加了第一个布局绘制时间。 为了避免延迟,可以在Manifest中预先声明需要检索的字体。系统从提供程序中检索字体后,可立即使用。如果字体检索时间比预期的长,系统将终止提取字体并使用默认字体。
要在Menifest中预先声明字体,请执行以下步骤:
在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>
使用meta-data标签在清单中声明资源数组。
<meta-data android:name="preloaded_fonts" android:resource="@array/preloaded_fonts" />
添加证书
当字体提供程序未预先安装或使用支持库时,必须声明字体提供程序签名的证书。 系统使用证书来验证字体提供程序的身份。
注意:如果在Android Studio中使用字体选择器工具,Android Studio可以自动填充Google Play服务提供商的证书。
按照以下步骤添加证书:
创建带有证书详细信息的字符串数组。 有关证书详细信息的更多信息,参阅字体提供程序的文档。
<?xml version="1.0" encoding="utf-8"?> <resources><string-array name="certs"><item>MIIEqDCCA5CgAwIBAgIJA071MA0GCSqGSIb3DQEBBAUAMIGUMQsww...</item></string-array> </resources>
将fontProviderCerts属性设置为字符串数组。
android:fontProviderCerts="@array/certs"
注意:如果提供程序有多个证书集,可以定义一个字符串数组的数组。
Android 8.0 新特性(一) - 可下载字体相关推荐
- Android 4.0新特性(中文)
Android 4.0新特性(中文) 转自http://www.eoeandroid.com/thread-103300-1-1.html android4.0 SDK发布有一段时间了,在eoe上找到 ...
- 安卓9.0发布,献上Android 9.0新特性适配处理
安卓9.0即Android 9.0已经面向全球发布,它的代号是Pie,仍然基于Linux内核构建.为了避免Android 9.0 Pie新特性更新引发的适配问题,本文将介绍Android 9.0将带来 ...
- android 5.0 新功能,Android 5.0新特性有哪些?安卓5.0新功能汇总
Android 5.0新特性有哪些?经过一段时间曝光与测试后,期待已久的Android L系统正式发布了,新一代安卓系统正式名称为Android 5.0 Lollipop(棒棒糖).Android 5 ...
- Android RecyclerView(五)封装Holder与Adapter(Android 5.0 新特性)
Android RecyclerView(五)封装Holder与Adapter(Android 5.0 新特性) 1 效果 2 BaseHolder的封装 public class BaseViewH ...
- RecyclerView(四)设置分割线样式(Android 5.0 新特性)
Android RecyclerView(四)设置分割线样式(Android 5.0 新特性) 样式一 在这里,其实是设置了每一个 条目布局中的子布局的android:layout_margin = ...
- RecyclerView(三)实现聊天窗口样式(Android 5.0 新特性)
Android RecyclerView(三)实现聊天窗口样式(Android 5.0 新特性) 效果 1 聊天窗口子视图布局文件 1.1 左边消息视图布局文件 使用到的背景图片 <?xml v ...
- RecyclerView(一)综合使用综述(Android 5.0 新特性)
Android RecyclerView(一)综合使用综述(Android 5.0 新特性) RecyclerView是support.v7包中的控件,可以说是ListView和GridView的增强 ...
- 开发者必看|Android 8.0 新特性及开发指南
背景介绍 谷歌2017I/O开发者大会今年将于5月17-19日在美国加州举办.大会将跟往年一样发布最新的 Android 系统,今年为 Android 8.0.谷歌在今年3 月21日发布 Androi ...
- Android 7.0 新特性
注:本文是从谷歌官网翻译过来的,放这里便于查阅和消化理解,更多详细知识点请自备梯子访问官网~ API 级别:24 代号:N Android 7.0 Nougat 为用户和开发者引入多种新功能.本文重点 ...
- Android 6.0新特性
注:本文是从谷歌官网翻译过来的,放这里便于查阅和消化理解,更多详细知识点请自备梯子访问官网~ Android 6.0(API 级别 23)除了提供诸多新特性和功能外,还对系统和 API 行为做出了各种 ...
最新文章
- linux命令vgdisplay提示权限不足,linux常用命令总结
- 穹顶下业务流程管理失位
- 在Android Studio上进行OpenCV 3.1开发
- python新手菜鸟之基础篇
- 服务器可以pyqt显示吗,用pyqt+socket实现远程操作服务器的一个例子,PyQtsocket,方法,示例...
- typescript入门简明教程
- 新能源补贴退坡 广汽新能源、比亚迪不涨价 蔚来最狠!
- Matlab程序——修正鲍威尔Powell法
- Linux中c语言strcmp,c语言常用函数strcmp函数和strcpy函数
- kudu底层存储引擎的数据组织方式
- 用html制作粒子线条,html5 canvas跟随鼠标粒子线条动画特效
- 空间四点定位原理及应用
- Pocket PC 2003 PC网卡上网设置
- 怎样使用Markdown输入数学公式
- 【转】Maximal Information Coefficient (MIC)最大互信息系数详解与实现
- Ubuntu20.04安装中国版firefox
- Android开发中的Log打印日志
- 分享一个技术知识类电子书网站
- 黄河科技学院计算机应用技术在哪个校区,黄河科技学院成考计算机应用技术(高升专)专业_黄河科技学院成考报名_成考计算机应用技术专业就业方向_中国教育在线...
- 3ds max法线贴图制作流程