可下载字体简介

在Android 8.0(API level 26)和Android Support库26开始提供了从字体提供程序下载字体的API接口,用以替代将字体绑定打包到APK文件中,或者让APK下载字体文件。这个功能在Android 8.0(API level 26)及以上版本系统可用,或者在API level 14及以上的系统,通过26及以上版本的Support库实现。

可下载字体功能有一下好处

  • 降低APK文件大小
  • 提高应用安装成功率
  • 多个APK可以通过提供程序共享相同的字体,在需要的时候才从提供程序获取,这样可以改善系统生态的健康,节省用户移动设备的数据,内存以及硬盘存储空间。

更多相关内容可参考Google 官方文档

可下载字体如何实现?

字体提供器是能将字体缓存到本地的应用,其他应用就可以请求和共享字体,大致的逻辑流程下图所示:

可下载字体实现方法

可下载字体的实现方法有以下几种

  • 通过AndroidStudio和Google Play服务框架实现;
  • 通过代码编程实现;
  • 通过support支持库实现。

通过AndroidStudio和Google Play服务框架实现可下载字体

通过Android Studio 3.0及以上版本,可为应用配置下载字体。另外可使用Google Play服务框架的字体提供器,入门可下载字体功能。

注意:设备必须有11及以上版本的Google服务框架,才能使用Google字体提供器。

使用步骤如下:

  1. 打开布局文件,在布局编辑器(Layout Editor)中,切换为设计(Design)页面,点击选中需要设置字体的TextView控件,然后在属性(Attributes)窗口中,依次展开All Attributes>fontFamily>More Fonts,打开字体资源选择器
  2. 在选择器页面的Source选择Google Fonts
  3. 在选择对应的字体(选择Downloadable Fonts中的字体),选择字体样式,点击“OK”按钮即可。

Android Studio会自动生成需要渲染的字体描述XML文件,并添加应用中。

4. 预览字体文件

通过编程实现可下载字体功能

从Android 8.0(API level 26)开始,系统直接支持可下载字体,但是在之前的版本,则需要使用26.0及以上版本的支持库来实现。

编程方式实现可下载字体功能,你需要掌握两个关键的类

  • android.graphics.fonts.FontRequest:这个类可以创建一个字体请求
  • android.provider.FontsContract:这个类可以可以基于字体请求创建一个字体样式(Typeface)对象

你的应用通过FontsContractAPI从提供器中索引字体。每个字体提供程序对Android版本和支持的语言都有一套自己的限制,详情需要参考字体提供程序的相关文档。

下载字体,按一下步骤实现:

  1. 创建一个android.graphics.fonts.FontRequest类的对象,用来想提供程序请求字体。创建一个请求,需要传入以下参数:
  • 字体提供程序的认证
  • 用来区分提供程序的字体提供程序包名
  • 字体查询索引
  • 用以验证提供程序身份的证书哈希值列表

示例:

val fontRequest = FontRequest("com.google.android.gms.fonts","com.google.android.gms","Aclonica",R.array.com_google_android_gms_fonts_certs)

证书哈希值列表在XML资源中定义

<?xml version="1.0" encoding="utf-8"?>
<resources><array name="com_google_android_gms_fonts_certs"><item>@array/com_google_android_gms_fonts_certs_dev</item><item>@array/com_google_android_gms_fonts_certs_prod</item></array><string-array name="com_google_android_gms_fonts_certs_dev"><item>MIIEqDCCA5CgAwIBAgIJANWFuGx90071MA0GCSqGSIb3DQEBBAUAMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAeFw0wODA0MTUyMzM2NTZaFw0zNTA5MDEyMzM2NTZaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBANbOLggKv+IxTdGNs8/TGFy0PTP6DHThvbbR24kT9ixcOd9W+EaBPWW+wPPKQmsHxajtWjmQwWfna8mZuSeJS48LIgAZlKkpFeVyxW0qMBujb8X8ETrWy550NaFtI6t9+u7hZeTfHwqNvacKhp1RbE6dBRGWynwMVX8XW8N1+UjFaq6GCJukT4qmpN2afb8sCjUigq0GuMwYXrFVee74bQgLHWGJwPmvmLHC69EH6kWr22ijx4OKXlSIx2xT1AsSHee70w5iDBiK4aph27yH3TxkXy9V89TDdexAcKk/cVHYNnDBapcavl7y0RiQ4biu8ymM8Ga/nmzhRKya6G0cGw8CAQOjgfwwgfkwHQYDVR0OBBYEFI0cxb6VTEM8YYY6FbBMvAPyT+CyMIHJBgNVHSMEgcEwgb6AFI0cxb6VTEM8YYY6FbBMvAPyT+CyoYGapIGXMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbYIJANWFuGx90071MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADggEBABnTDPEF+3iSP0wNfdIjIz1AlnrPzgAIHVvXxunW7SBrDhEglQZBbKJEk5kT0mtKoOD1JMrSu1xuTKEBahWRbqHsXclaXjoBADb0kkjVEJu/Lh5hgYZnOjvlba8Ld7HCKePCVePoTJBdI4fvugnL8TsgK05aIskyY0hKI9L8KfqfGTl1lzOv2KoWD0KWwtAWPoGChZxmQ+nBli+gwYMzM1vAkP+aayLe0a1EQimlOalO762r0GXO0ks+UeXde2Z4e+8S/pf7pITEI/tP+MxJTALw9QUWEv9lKTk+jkbqxbsh8nfBUapfKqYn0eidpwq2AzVp3juYl7//fKnaPhJD9gs=</item></string-array><string-array name="com_google_android_gms_fonts_certs_prod"><item>MIIEQzCCAyugAwIBAgIJAMLgh0ZkSjCNMA0GCSqGSIb3DQEBBAUAMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDAeFw0wODA4MjEyMzEzMzRaFw0zNjAxMDcyMzEzMzRaMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBAKtWLgDYO6IIrgqWbxJOKdoR8qtW0I9Y4sypEwPpt1TTcvZApxsdyxMJZ2JORland2qSGT2y5b+3JKkedxiLDmpHpDsz2WCbdxgxRczfey5YZnTJ4VZbH0xqWVW/8lGmPav5xVwnIiJS6HXk+BVKZF+JcWjAsb/GEuq/eFdpuzSqeYTcfi6idkyugwfYwXFU1+5fZKUaRKYCwkkFQVfcAs1fXA5V+++FGfvjJ/CxURaSxaBvGdGDhfXE28LWuT9ozCl5xw4Yq5OGazvV24mZVSoOO0yZ31j7kYvtwYK6NeADwbSxDdJEqO4k//0zOHKrUiGYXtqw/A0LFFtqoZKFjnkCAQOjgdkwgdYwHQYDVR0OBBYEFMd9jMIhF1Ylmn/Tgt9r45jk14alMIGmBgNVHSMEgZ4wgZuAFMd9jMIhF1Ylmn/Tgt9r45jk14aloXikdjB0MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLR29vZ2xlIEluYy4xEDAOBgNVBAsTB0FuZHJvaWQxEDAOBgNVBAMTB0FuZHJvaWSCCQDC4IdGZEowjTAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBAUAA4IBAQBt0lLO74UwLDYKqs6Tm8/yzKkEu116FmH4rkaymUIE0P9KaMftGlMexFlaYjzmB2OxZyl6euNXEsQH8gjwyxCUKRJNexBiGcCEyj6z+a1fuHHvkiaai+KL8W1EyNmgjmyy8AW7P+LLlkR+ho5zEHatRbM/YAnqGcFh5iZBqpknHf1SKMXFh4dd239FJ1jWYfbMDMy3NS5CTMQ2XFI1MvcyUTdZPErjQfTbQe3aDQsQcafEQPD+nqActifKZ0Np0IS9L9kR/wbNvyz6ENwPiTrjV2KRkEjH78ZMcUQXg0L3BYHJ3lc69Vs5Ddf9uUGGMYldX3WfMBEmh/9iFBDAaTCK</item></string-array>
</resources>

注意:如果您从系统预安装的提供程序中请求字体,则无需添加证书。但是,如果通过支持库请求字体,则必须提供证书。

  1. 创建FontsContract.FontRequestCallback类的实例

  2. 覆盖 onTypefaceRetrieved()方法 :这是字体请求已完成的回调方法,检索到的字体作为回调参数,您可以根据需要在此方法设置字体。例如,您可以在TextView设置字体样式

  3. 重写 onTypefaceRequestFailed() 方法:这字体请求过程中出现错误的回调方法。有关错误代码的更多信息,请参阅 error code constants。

  4. 调用FontsContract.requestFont()方法重字体提供程序中获取字体内容。这个方法将检查字体是否存在缓存中,如果字体不在本地缓存,将会从字体提供程序中异步下载字体。调用该方法传入以下参数:

  • Context类对象
  • android.graphics.fonts.FontRequest类对象
  • 用户监听请求结果的回调(FontsContract.FontRequestCallback对象)
  • 字体下载线程的处理程序(Handler对象)

代码示例:

val fontRequest = FontRequest("com.google.android.gms.fonts","com.google.android.gms","Aclonica",R.array.com_google_android_gms_fonts_certs)val requestCallbacks = object : FontsContract.FontRequestCallback() {override fun  onTypefaceRetrieved(typeface: Typeface) {Log.e("AAAAAA", "onTypefaceRetrieved: ${typeface.toString()}")typeFace = typefaceFontRequestManager.instance.onTypefaceRetrieved("Aclonica", typeface)}override fun onTypefaceRequestFailed(reason: Int) {Log.e("AAAAAA", "onTypefaceRequestFailed: ${reason}")}
}FontsContract.requestFont(this, fontRequest, requestCallbacks, mHandler)

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

26及以上版本的支持库,为运行Android API版本低于26且大于14的设备上提供可下载字体的功能的支持。android.support.v4.provider包名下包含了相关的类,支持库中相关的类跟系统框架中的类似,下载字体的流程也跟前面提到的系统框架下载字体类似。

支持库与系统框架类对应关系

系统框架中的类 支持库中的类 备注
android.provider.FontRequest androidx.core.provider.FontRequest -
android.provider.FontsContract androidx.core.provider.FontsContractCompat -

使用支持库实现可下载字体的功能,也就是使用支持库中的androidx.core.provider(或者是android.support.v4.provider)包下的类替换系统框架中的android.provider包下的类。

注意:通过支持库实现可下载字体功能,即使字体提供程序是系统预安装的,在你请求字体的时候,必须提供证书。

在项目中添加依赖库的支持

在项目中添加com.android.support:support-compat的依赖(如果targetSDKVersion是28及以上,可以使用androidx.core:core依赖)

通过XML资源来定义使用可下载字体

在Android 8.0 (API level 26)及26的支持库开始,提供了一种更有效方法声明自定义的字体,那就是通过XML资源文件。这就意味着不在需要将字体打包到程序的asset资源中,如果字体支持支持,还可以轻松设置自定义字体的主题样式,比如:字体粗细。

  1. res/font目录下创建XML文件
  2. 在XML文件中添加<font-family>根节点,跟字体相关的属性如下示例XML文件所示:
<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:app="http://schemas.android.com/apk/res-auto"app:fontProviderAuthority="com.google.android.gms.fonts"app:fontProviderCerts="@array/com_google_android_gms_fonts_certs"app:fontProviderPackage="com.google.android.gms"app:fontProviderQuery="Aclonica">
</font-family>
  1. 通过@font/xml_font_file_name的方式引用字体文件,可以在XML布局文件中直接引用,也可以在代码中使用getFont()方法获取字体文件。

AndroidManifest.xml中预声明字体

在布局中关联字体和检索下载是异步任务。第一次尝试检索字体会默认请求字体提供程序,因此会增加第一次布局加载时间,为避免延迟,你可以在AndroidManifest.xml预声明需要检索的字体。在系统从提供程序中获取到字体后,将会立即可用。如果字体获取使用的事件超过了期望,系统将会中断获取进程,并使用默认的字体。

在清单中预声明字体的步骤如下:

  1. 在资源目录res/values下创建一个数组资源xml文件,,并在里面列出需要预定义的字体
    示例:
<?xml version="1.0" encoding="utf-8"?>
<resources><array name="preloaded_fonts" translatable="false"><item>@font/aclonica</item><item>@font/alex_brush</item><item>@font/bilbo_swash_caps</item></array>
</resources>
  1. AndroidManifest.xml中使用meta-data标签声明预定义的字体数组
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"><!-- .... --><application><!-- .... --><meta-dataandroid:name="preloaded_fonts"android:resource="@array/preloaded_fonts" /></application></manifest>

添加证书

如果字体提供程序不是预安装,或者如果你使用支持库实现,那么你就必须声明字体提供程序验证使用的签名证书,系统使用该证书校验字体提供程序的身份。

注意:如果你使用Android Studio的字体选择工具选择Google Play服务框架提供程序中的字体,Android Studio会自动配置证书。

添加证书的步骤如下:

  1. 创建一个包含证书详细内容的字符数组资源
<?xml version="1.0" encoding="utf-8"?>
<resources><string-array name="com_google_android_gms_fonts_certs_prod"><item>MIIEQzCCAyugAwIBAgIJAMLgh0ZkSjCNMA0GCSqGSIb3DQEBBAUAMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDAeFw0wODA4MjEyMzEzMzRaFw0zNjAxMDcyMzEzMzRaMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBAKtWLgDYO6IIrgqWbxJOKdoR8qtW0I9Y4sypEwPpt1TTcvZApxsdyxMJZ2JORland2qSGT2y5b+3JKkedxiLDmpHpDsz2WCbdxgxRczfey5YZnTJ4VZbH0xqWVW/8lGmPav5xVwnIiJS6HXk+BVKZF+JcWjAsb/GEuq/eFdpuzSqeYTcfi6idkyugwfYwXFU1+5fZKUaRKYCwkkFQVfcAs1fXA5V+++FGfvjJ/CxURaSxaBvGdGDhfXE28LWuT9ozCl5xw4Yq5OGazvV24mZVSoOO0yZ31j7kYvtwYK6NeADwbSxDdJEqO4k//0zOHKrUiGYXtqw/A0LFFtqoZKFjnkCAQOjgdkwgdYwHQYDVR0OBBYEFMd9jMIhF1Ylmn/Tgt9r45jk14alMIGmBgNVHSMEgZ4wgZuAFMd9jMIhF1Ylmn/Tgt9r45jk14aloXikdjB0MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLR29vZ2xlIEluYy4xEDAOBgNVBAsTB0FuZHJvaWQxEDAOBgNVBAMTB0FuZHJvaWSCCQDC4IdGZEowjTAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBAUAA4IBAQBt0lLO74UwLDYKqs6Tm8/yzKkEu116FmH4rkaymUIE0P9KaMftGlMexFlaYjzmB2OxZyl6euNXEsQH8gjwyxCUKRJNexBiGcCEyj6z+a1fuHHvkiaai+KL8W1EyNmgjmyy8AW7P+LLlkR+ho5zEHatRbM/YAnqGcFh5iZBqpknHf1SKMXFh4dd239FJ1jWYfbMDMy3NS5CTMQ2XFI1MvcyUTdZPErjQfTbQe3aDQsQcafEQPD+nqActifKZ0Np0IS9L9kR/wbNvyz6ENwPiTrjV2KRkEjH78ZMcUQXg0L3BYHJ3lc69Vs5Ddf9uUGGMYldX3WfMBEmh/9iFBDAaTCK</item></string-array>
</resources>
  1. 在字体配置文件中的fontProviderCerts节点配置证书
<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:app="http://schemas.android.com/apk/res-auto"app:fontProviderAuthority="com.google.android.gms.fonts"app:fontProviderPackage="com.google.android.gms"app:fontProviderQuery="Alex Brush"app:fontProviderCerts="@array/com_google_android_gms_fonts_certs_prod">
</font-family>

说明:如果提供程序包含多个证书,可以定义一个数组,数组的元素就是包含证书的字符数组

<?xml version="1.0" encoding="utf-8"?>
<resources><array name="com_google_android_gms_fonts_certs"><item>@array/com_google_android_gms_fonts_certs_dev</item><item>@array/com_google_android_gms_fonts_certs_prod</item></array><string-array name="com_google_android_gms_fonts_certs_dev"><item> MIIEqDCCA5CgAwIBAgIJANWFuGx90071MA0GCSqGSIb3DQEBBAUAMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAeFw0wODA0MTUyMzM2NTZaFw0zNTA5MDEyMzM2NTZaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBANbOLggKv+IxTdGNs8/TGFy0PTP6DHThvbbR24kT9ixcOd9W+EaBPWW+wPPKQmsHxajtWjmQwWfna8mZuSeJS48LIgAZlKkpFeVyxW0qMBujb8X8ETrWy550NaFtI6t9+u7hZeTfHwqNvacKhp1RbE6dBRGWynwMVX8XW8N1+UjFaq6GCJukT4qmpN2afb8sCjUigq0GuMwYXrFVee74bQgLHWGJwPmvmLHC69EH6kWr22ijx4OKXlSIx2xT1AsSHee70w5iDBiK4aph27yH3TxkXy9V89TDdexAcKk/cVHYNnDBapcavl7y0RiQ4biu8ymM8Ga/nmzhRKya6G0cGw8CAQOjgfwwgfkwHQYDVR0OBBYEFI0cxb6VTEM8YYY6FbBMvAPyT+CyMIHJBgNVHSMEgcEwgb6AFI0cxb6VTEM8YYY6FbBMvAPyT+CyoYGapIGXMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbYIJANWFuGx90071MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADggEBABnTDPEF+3iSP0wNfdIjIz1AlnrPzgAIHVvXxunW7SBrDhEglQZBbKJEk5kT0mtKoOD1JMrSu1xuTKEBahWRbqHsXclaXjoBADb0kkjVEJu/Lh5hgYZnOjvlba8Ld7HCKePCVePoTJBdI4fvugnL8TsgK05aIskyY0hKI9L8KfqfGTl1lzOv2KoWD0KWwtAWPoGChZxmQ+nBli+gwYMzM1vAkP+aayLe0a1EQimlOalO762r0GXO0ks+UeXde2Z4e+8S/pf7pITEI/tP+MxJTALw9QUWEv9lKTk+jkbqxbsh8nfBUapfKqYn0eidpwq2AzVp3juYl7//fKnaPhJD9gs=</item></string-array><string-array name="com_google_android_gms_fonts_certs_prod"><item>MIIEQzCCAyugAwIBAgIJAMLgh0ZkSjCNMA0GCSqGSIb3DQEBBAUAMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDAeFw0wODA4MjEyMzEzMzRaFw0zNjAxMDcyMzEzMzRaMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBAKtWLgDYO6IIrgqWbxJOKdoR8qtW0I9Y4sypEwPpt1TTcvZApxsdyxMJZ2JORland2qSGT2y5b+3JKkedxiLDmpHpDsz2WCbdxgxRczfey5YZnTJ4VZbH0xqWVW/8lGmPav5xVwnIiJS6HXk+BVKZF+JcWjAsb/GEuq/eFdpuzSqeYTcfi6idkyugwfYwXFU1+5fZKUaRKYCwkkFQVfcAs1fXA5V+++FGfvjJ/CxURaSxaBvGdGDhfXE28LWuT9ozCl5xw4Yq5OGazvV24mZVSoOO0yZ31j7kYvtwYK6NeADwbSxDdJEqO4k//0zOHKrUiGYXtqw/A0LFFtqoZKFjnkCAQOjgdkwgdYwHQYDVR0OBBYEFMd9jMIhF1Ylmn/Tgt9r45jk14alMIGmBgNVHSMEgZ4wgZuAFMd9jMIhF1Ylmn/Tgt9r45jk14aloXikdjB0MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLR29vZ2xlIEluYy4xEDAOBgNVBAsTB0FuZHJvaWQxEDAOBgNVBAMTB0FuZHJvaWSCCQDC4IdGZEowjTAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBAUAA4IBAQBt0lLO74UwLDYKqs6Tm8/yzKkEu116FmH4rkaymUIE0P9KaMftGlMexFlaYjzmB2OxZyl6euNXEsQH8gjwyxCUKRJNexBiGcCEyj6z+a1fuHHvkiaai+KL8W1EyNmgjmyy8AW7P+LLlkR+ho5zEHatRbM/YAnqGcFh5iZBqpknHf1SKMXFh4dd239FJ1jWYfbMDMy3NS5CTMQ2XFI1MvcyUTdZPErjQfTbQe3aDQsQcafEQPD+nqActifKZ0Np0IS9L9kR/wbNvyz6ENwPiTrjV2KRkEjH78ZMcUQXg0L3BYHJ3lc69Vs5Ddf9uUGGMYldX3WfMBEmh/9iFBDAaTCK</item></string-array>
</resources>

经验总结

可下载字体是一个很好的策略,但是由于国内手机厂商比较多,没有一个统一的Android手机生态(众所周知的原因,Google Play服务国内无法使用),所以必须自己搭建一套字体提供程序,这样一来也是相当繁琐的。这个功能也是从Android 8.0(API 26)才开始提出(但可以通过支持库在Android 4.0(API 14)及以上版本使用),如果有兴趣的同学,还可以学些搭建自己的字体提供程序。

Android中使用可下载字体相关推荐

  1. Android中添加思源字体/NotoSansCJK/SourceHanSans

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 系统版本 ...

  2. Android中加入思源字体/NotoSansCJK/SourceHanSans

    系统版本号:Android 4.2.2_r1 本文主要是在Android中加入思源字体的过程记录. 思源字体是Google和Adobe在2014.07.18公布的中文字体. 1.获取思源字体(Goog ...

  3. android 英文语言设置字体,Android中通过typeface设置字体-Go语言中文社区

    在网上跑图几个小时,终于总结完. 行吧行吧,发车-- 开发过程中,布局文件中指定仅限于系统自带的四种字体(android Studio 3.0.1),就如: 嫌丑都不喜欢?去下载字体包吧我是免费商用字 ...

  4. Android中TextView超细字体 ,各种尝试

    一般来说,字体变大,文字也跟着变粗了,怎样让比较大的字体细一点. 1.用HTML尝试  TextView textView = (TextView)findViewById(R.id.testText ...

  5. Android中http断点下载,Android HttpURLConnection断点下载(单线程)

    HttpCilent 跟 HttpURLConnection 是安卓原生的用来实现http请求的类: Android 6.0之后取消了HttpClient,不支持跟新 ,今天小编使用的是HttpURL ...

  6. android typeface设置字体,Android中通过typeface设置字体

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 今天整理过去的笔记时,发现之前我记录了一个关于android typeface字体设置的辟谣笔记 这里分享出来//将字体 ...

  7. Android 中使用自定义ttf字体实现酷炫效果

    所谓无图无真相,先看效果图: Java代码如下: package yc.android.fonts;import android.app.Activity; import android.graphi ...

  8. Android 中获取网络下载速率的方法

    文章目录 相关方法如下: // 获取应用程序的 uid public static int getAppUid() {int uid = -1;// KmApplication是我的自定义Applic ...

  9. android 使用 系统字体,Android_解析Android中使用自定义字体的实现方法,1、Android系统默认支持三种字 - phpStudy...

    解析Android中使用自定义字体的实现方法 1.Android系统默认支持三种字体,分别为:"sans", "serif", "monospace ...

最新文章

  1. 兴趣部落的 Git 迁移实践
  2. cx_oracle windows缺少100 dll,Windows10无法运行QQ提示缺少MSVCR100.dll的解决方案
  3. 【Linux】Linux与Windows的部分不同
  4. SQL SERVER 用sql语句将一列数据拼接成一个字符串
  5. PyQt标准框——QInputDialog(二)
  6. WebRTC 音视频开发之路
  7. 【活动(广州)】MonkeyFest2018 微软最有价值专家讲座
  8. 前端学习(2769):发送网络请求
  9. 第十二节: EF的三种模式(二) 之 ModelFirst模式(SQLServer为例)
  10. circlegan_【源码解读】cycleGAN(二) :训练
  11. 开发中很实用的10个效果
  12. 【WPF】鼠标穿透窗口(类似于桌面歌词那样子)
  13. win10好用的C语言软件,9款超级实用的Win10软件,一定要收藏,简直不要太好用
  14. 如何使用pyodbc
  15. springboot 操作es 之elasticsearch-rest-high-level-client
  16. js实现bilibili弹幕列表随视频播放滚动
  17. ubuntu为软件设定图标
  18. Pytorch之KLDivLoss
  19. Chromium为视频标签 video 全屏播放的过程分析
  20. 遥感图像的空间分辨率,光谱分辨率等

热门文章

  1. android 自定义键盘的安全性,自定义安全键盘——仿民生银行
  2. java毕业设计刷题题库系统mybatis+源码+调试部署+系统+数据库+lw
  3. jain-sip DateHeader格式自定义以兼容GB28181协议
  4. 用的Jlink但是却提示找不到Ulink的解决办法
  5. “曾经沧海难为水,除却巫山不是云”
  6. chrome无法翻译的解决办法
  7. pubg国际版服务器维护苹果,pubg国际版服务器维护
  8. [HXBCTF 2021]easywill writeup(WillPHP源码审计+利用pearcmd.php文件包含getshell)
  9. 【Unity3D】 Blender2.9+二足角色FPS(TPS)手臂的IK骨骼绑定经验总结
  10. CISCO WAAS部署