1、什么是 EmojiCompat ?
EmojiCompat 是 Google 官方给我们提供的一个 Emoji 表情兼容库,最低支持到 Android 4.4(Api Level 19) 的系统设备,它可以防止应用中,出现以信封的形式来显示 Emoji,虽然它仅仅只是因为你当前的设备没有这个字体而已。通过 EmojiCompat ,你的设备无需等待 Android 系统更新,就可以获得最新的 Emoji 表情显示效果。
EmojiCompat 的运行原理如下图所示:
官方给提供使用EmojiCompat字体库的途径有两种
1)、可下载的字体配置
原理:可下载的字体的方式会在首次启动 app 的时候检查本地是否有该字体,没有的话会从网上下载最新的 Emoji 字体,然后遇到不支持的 Emoji,就会从这个字体文件中,加载资源并且渲染
缺点:可下载字体的方式,完全依赖 GMS 服务,在没有 GMS 服务的手机上并不可用
2)、本地捆绑的字体配置
原理:本地捆绑的方式会在 App 打包的过程中,植入一个最新的 Emoji 字体文件,然后遇到不支持的 Emoji,就会从这个字体文件中,加载资源并且渲染
缺点:本地捆绑的方式会嵌入一个约 9M+ 的字体文件,无形中增大了 Apk 安装包的体积
目前官方使用的是 NotoColorEmojiCompat.ttf 字体文件,文件大小约 9M+
下面先讲下如何使用这两种方式去进行初始化
3、EmojiCompat 实践
因为本地捆绑字体配置的方式会使我们的 app 包体积增大 9M+,这是完全不能接受的,而GMS服务我们又有很多手机没有,即使有了可能也会被墙。
捋一捋现在的问题:可下载的字体配置完全依赖 GMS 服务,如果没有 GMS 服务,则会导致字体下载失败,相应的 EmojiCompat 就会初始化失败,EmojiCompat 初始化失败,则看当前系统是否支持该 emoji,如果不支持,那就会显示成信封状。之前本地捆绑字体配置的方式因为会使我们的 app 包体积增大,直接被 pass 掉了
看了下EmojiCompat源码初始化字体依赖库有三个重载方法:
1、方式一:传入一个 Typeface 对象和一个 InputStream 流对象
2、方式二:传入一个 Typeface 对象和一个 ByteBuffer 流对象
3、方式三:传入一个 AssetManager 对象和一个 assetPath 路径
所以我们可以通过
1、在 load 方法里面开启一个子线程执行任务
2、在可执行的任务里面通过方式一构建 MetadataRepo 最终完成初始化操作。
实测暂且先将NotoColorEmojiCompat.ttf 字体文件放到手机SD卡中加载初始化EmojiCompat 可行。等服务器配合后再做字体资源加载。
https://developer.android.google.cn/reference/androidx/emoji/text/EmojiSpan
EmojiCompat.process会遍历字符串并且找到所有的 emoji,并为每个 emoji 添加 EmojiSpan。EmojiSpan 会告诉 Android 不要以字符串的形式显示,而是调用 draw 方法来显示。EmojiCompat.process 使用字典树来查找所有的子字符串来匹配一个已知的 emoji。