第二章 Emoji 在Android版本的向下兼容

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。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容