注: 该方法会导致数字显示不正常, 因为typeface渲染了全部字符, 而数字的渲染有问题, 暂时还没找到解决办法

公司项目要求各平台客户端的emoji表情显示效果统一使用iOS风格

把TextView的字体替换成iOS风格emoji的字体就可以实现

同时, 由于iOS支持的emoji数量肯定比那些没有后续更新的Android机型要多, 为了让这些旧机型都能显示出新表情, 用到了Android提供的EmojiCompat (原理可以看官方文档)

为了尽量减少现有代码的修改, 我用了Anko Layout扩展控件, 把需要处理emoji的TextView和EditText替换成扩展的控件就行了


准备工作

Google提供了Noto Color Emoji, 但是从官网给的预览来看, 和iOS的风格并不一样, 所以我用的是从这里下载到的字体

EmojiCompat只识别assets里命名为NotoColorEmojiCompat.ttf的字体, 所以把字体改名并放到assets里面

在build.gradle中导入以下依赖:

implementation 'com.android.support:support-emoji:28.0.0'
implementation 'com.android.support:support-emoji-bundled:28.0.0'
implementation 'com.android.support:support-emoji-appcompat:28.0.0'

构建自动处理emoji的控件

首先, EmojiCompat是需要初始化的, 初始化代码如下:

EmojiCompat.init(BundledEmojiCompatConfig(this))

建议将初始化步骤放在Application的onCreate中完成

然后, 使用Anko Layout扩展EmojiCompat的控件:

fun ViewManager.emojiTextView(init: (@AnkoViewDslMarker EmojiAppCompatTextView).() -> Unit): EmojiAppCompatTextView {
    return ankoView({ EmojiAppCompatTextView(it) }, 0){
        typeface = Typeface.createFromAsset(context.assets, "NotoColorEmojiCompat.ttf")
        init()
    }
}

fun ViewManager.emojiEditText(init: (@AnkoViewDslMarker EmojiAppCompatEditText).() -> Unit): EmojiAppCompatEditText {
    return ankoView({ EmojiAppCompatEditText(it) }, 0){
        typeface = Typeface.createFromAsset(context.assets, "NotoColorEmojiCompat.ttf")
        init()
    }
}

因为我暂时用不到EmojiAppCompatButton, 所以先不扩展了

最后, 把需要处理的控件替换成扩展控件, 就可以自动显示成iOS风格的emoji了


参考文章: https://www.cnblogs.com/plokmju/p/8143531.html