让您的应用支持新式的 Emoji 符号吧!
Emoji 已无处不在,自发布以来 emoji 已成为我们语言中不可或缺的一部分,它生动有效的表达力带来了语言文字层面的变革。您可能不会想到,连银行应用、健身应用或外卖应用也都应该支持 emoji。Emoji 现在已经遍布短信等通讯应用,已经成为我们语言的一部分。如果您的应用包含文本视图,那么它应该支持 emoji,至于原因,且听我娓娓道来。🥳
遇到的问题 😖
如果您的应用没有对 emoji 进行相应的处理,较早版本的 Android 可能不知道如何去显示它们。在大多数情况下,只会显示一个空白方格,我们称之为 "豆腐"。在未正确处理 emoji 的应用中,在原本应该显示 emoji 的位置将会显示出一个 "豆腐块",这可能会给用户带来困惑。例如,如果用户在 TODO 应用的任务列表里,向 EditText 中添加一个 🐶 表情,此时用户看到 "豆腐" 出现在屏幕上而没有显示输入的 🐶 表情时,用户则会认为应用存在 bug。
为了使 emoji 更加有趣,在很多情况下,一个 emoji 是由其它多个 emoji 组成的。比如 💪🏾 是 💪 和 🟫 的组合。
如果您输入肌肉的表情,而应用显示了胳膊和颜色方块,那么就不仅会让用户感到困惑,同时对于不同肤色风格的表述也有失准确,从而降低了应用的用户体验。
随着语言的发展,emoji 也在不断进化。每年新的 emoji 会以 Unicode 的形式添加到新的 Android 发行版本中,但可惜的是,没有途径能够将新的 emoji 字体添加到 Android S 之前的版本。
解决方案
emoji2
https://developer.android.google.cn/jetpack/androidx/releases/emoji2
简单来说,图形化的 emoji 实际上只是显示在文本中的一个图片 🖼️ 。它通过 Unicode 码点来表示,如同字母 'e',但是 Unicode 规定: 当显示码点时,应显示 emoji 图片而非字母 'e'。这张图片仅是字体文件中的一个 png (更多内容请参阅我们为 Android 打造的 emoji 字体)。通常您可能认为字体内容就是字母 'e' 的笔画定义,但实际上字体的功能非常强大,可以包含 bitmap、png、svg,甚至完整的程序——有人在字体中实现了一个游戏 🤯。
为 Android 打造的 emoji 字体
https://github.com/googlefonts/noto-emoji游戏
https://www.coderelay.io/fontemon.html#player
字形
https://en.wikipedia.org/wiki/GlyphEmojiSpan
https://developer.android.google.cn/reference/androidx/emoji/text/EmojiSpan
EmojiCompat.process
https://developer.android.google.cn/reference/androidx/emoji/text/EmojiCompat#process(java.lang.CharSequence,%20int,%20int,%20int,%20int)
一个字符串就是一组码点,它们通过数字来表示字形,比如字母 'm' 或者数字 '1'。Emoji 同样有对应的码点——您可以在 Emojipedia 上找到它们,包括我们现在要显示的挥手 emoji。
Emojipedia
https://emojipedia.org/挥手 emoji
https://emojipedia.org/waving-hand/
最后
https://support.google.com/googleplay/android-developer/answer/11190649?hl=zh-cn
推荐阅读