admin管理员组文章数量:1594974
原文地址: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() {
@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)的可用性。
- 在res / font文件夹中创建一个新的XML文件
添加根元素,并设置与以下示例XML文件所示的字体相关属性:
<?xml version="1.0" encoding="utf-8"?> <font-family xmlns:android="http://schemas.android/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 新特性(一) - 可下载字体 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1728201500a1149439.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论