【Interface&navigation】可下载的字体(26)


Android 8.0(API级别26)和Android支持库26引入了对API的支持,以便从提供者应用程序请求字体,而不是将文件捆绑到APK或让APK下载字体。该功能可通过支持库26在运行Android API 14及更高版本的设备上使用。

可下载字体功能具有以下优点:

减少APK大小
提高应用安装成功率
改善整体系统健康状况,因为多个APK可以通过提供商共享相同的字体。这样可以节省用户的蜂窝数据,手机内存和磁盘空间。在此模型中,需要时通过网络获取字体。
请参阅以下相关资源:

[可下载的字体示例应用程序](https://github.com/googlesamples/android-DownloadableFonts)

可下载字体的工作原理如何?
字体提供程序是一种检索字体并在本地缓存它们的应用程序,以便其他应用程序可以请求和共享字体。图1说明了该过程。
【Interface&navigation】可下载的字体(26)
图1.可下载的字体过程

基础

您可以通过以下方式使用可下载字体功能:

通过Android Studio和Google Play服务
编程
通过支持库
通过Android Studio和Google Play服务使用可下载字体
您可以将应用程序设置为使用Android Studio 3.0或更高版本下载字体。为帮助您开始使用可下载字体功能,您可以使用Google Play服务中的字体提供程序。

注意:设备必须具有11或更高版本的Google Play服务才能使用Google字体提供商。

在布局编辑器中,选择一个TextView,然后在“ 属性”下 ,选择“ fontFamily”>“更多字体”。
【Interface&navigation】可下载的字体(26)
图2.使用Layout编辑器

将出现“ 资源”窗口。

在“ 来源”下拉列表中,选择“ Google字体”。
在“ 字体”框中,选择一种字体。
选择Create downloadable font并单击OK。

注意:要在应用程序中捆绑字体,请选择“ 将项目添加到项目”。
【Interface&navigation】可下载的字体(26)
图3. 从Resources窗口中选择字体

Android Studio会自动生成在应用中正确呈现字体所需的相关XML文件。
【Interface&navigation】可下载的字体(26)
图4.预览字体文件

以编程方式使用可下载字体

在Android 8.0(API级别26)之前,支持库26.0提供对可下载字体的完全支持。有关使用支持库的更多信息,请转到可下载字体支持库部分。

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

android.graphics.fonts.FontRequest:此类允许您创建字体请求。
FontsContract:此类允许您Typeface基于字体请求创建新对象。
您的应用程序使用FontsContractAPI 从字体提供程序检索字体 。每个提供商对其支持的Android版本和查询语言都有自己的一组限制。有关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() 方法以指示字体请求已完成。提供检索到的字体作为参数。您可以根据需要使用此方法设置字体。例如,您可以在a上设置字体TextView
重写该 onTypefaceRequestFailed() 方法以接收有关字体请求过程中的错误的信息。有关错误代码的更多信息,请参阅 error code constants。
调用FontsContract.requestFont() 方法从字体提供程序中检索字体。该方法启动检查以确定缓存中是否存在字体。如果字体在本地不可用,它将调用字体提供程序,异步检索字体,并将结果传递给回调。传递以下参数:
一个Context类的实例
一个android.graphics.fonts.FontRequest类的实例
回调以接收字体请求的结果
一个在线程上获取字体的处理程序
注意:确保此处理程序不是用户界面线程处理程序。

以下示例代码说明了整个可下载字体过程:

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);

有关如何从字体提供程序 下载字体的详细信息,请转到可 下载字体示例应用程序。

通过支持库使用可下载的字体

支持库26为运行Android API 14或更高版本的设备上的可下载字体功能提供支持。该 android.support.v4.provider软件包包含 用于实现向后兼容的可下载字体功能支持的类FontsContractCompat和FontRequest类。支持库类包含类似于框架的方法。下载字体的过程也类似于下载字体部分中提到的过程 。

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

注意:通过支持库请求字体时,必须提供证书。这甚至适用于预安装的字体提供程序。

添加支持库依赖项

要使用FontsContractCompat和FontRequest 类,必须在开发环境中修改应用程序项目的类路径依赖项。

要向应用程序项目添加支持库:

打开build.gradle应用程序的文件。
将支持库添加到该dependencies部分。

dependencies {
    ...
    compile "com.android.support:support-compat:27.1.1"
}

使用可下载字体作为XML中的资源

Android 8.0(API级别26)和支持库26提供了一种更快速,更方便的方式来将自定义字体声明为XML布局中的资源。这意味着,不需要将字体捆绑为资产。您可以为整个主题定义自定义字体,从而加快多个权重和样式的可用性,例如Bold,Medium或Light,如果提供的话。

在res/font文件夹中创建一个新的XML文件。
添加<font-family>根元素并设置与字体相关的属性,如以下示例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>

在布局XML文件中将文件称为@ font / font_file_name。您还可以使用该getFont() 方法以编程方式检索文件。例如, getFont(R.font.font_file_name)。

在清单中预先声明字体

布局通胀和资源检索是同步任务。默认情况下,第一次检索字体会触发对字体提供程序的请求,因此会增加第一个布局时间。为避免延迟,您可以预先声明需要在清单中检索的字体。系统从提供程序检索字体后,立即可用。如果字体检索花费的时间超过预期,系统将中止提取过程并使用默认字体。

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

在其中创建资源数组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服务提供商的值。有关使用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"

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

联系我

QQ:94297366
微信打赏:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ

公众号推荐:

【Interface&navigation】可下载的字体(26)

猜你喜欢

转载自blog.51cto.com/4789781/2146181