android开发中使用自定义emoji表情代替系统默认表情

由于使用融云集成聊天,一个端集成了IMKit,一个端只集成了IMLib,所以就造成IMLib的这一端不会自带emoji及显示。通过IMKit发送给IMLib端,显示成了系统的自带表情,而且与输入法的表情也不一致,于是就想办法把他们显示一致。


image.png
思路:

将IMKit中的emoji资源文件全部拷贝过来,然后通过匹配字符的方式用SpannableString替换为ImageSpan。

通过抓日志发现imkit发送过来的表情字符为:

content='☺☺'

实际android studio日志中显示为:


image.png

然后就想,这不是就是6个字符吗,一个个替换为ImageSpan即可。

但实际读到的字符串长度却是13。


image.png

最终通过github搜索有没有别人做过类似的项目。且看如下传送链接:https://github.com/OneGreenHand/Emoji

关键代码:

//text:原本字符串
public static CharSequence parse(String text, float textSize) {
    if (text == null) {
        return "";
    }
    final char[] chars = text.toCharArray();
    final SpannableStringBuilder ssb = new SpannableStringBuilder(text);
    int codePoint;
    boolean isSurrogatePair;
    for (int i = 0; i < chars.length; i++) {
        if (Character.isHighSurrogate(chars[i])) {
            continue;
        } else if (Character.isLowSurrogate(chars[i])) {
            if (i > 0 && Character.isSurrogatePair(chars[i - 1], chars[i])) {
                codePoint = Character.toCodePoint(chars[i - 1], chars[i]);
                isSurrogatePair = true;
            } else {
                continue;
            }
        } else {
            codePoint = (int) chars[i];
            isSurrogatePair = false;
        }
        if (emojiCodeList.contains(codePoint)) {
            Bitmap bitmap = BitmapFactory.decodeResource(gContext.getResources(), getResourceByCode(codePoint));
            BitmapDrawable bmpDrawable = new BitmapDrawable(gContext.getResources(), bitmap);
            bmpDrawable.setBounds(0, 0, (int) textSize, (int) textSize);
            CenterImageSpan imageSpan = new CenterImageSpan(bmpDrawable);
            ssb.setSpan(imageSpan, isSurrogatePair ? i - 1 : i, i + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
    }
    return ssb;
}

现在就可以跟输入法一起正常显示:


image.png

你可能感兴趣的:(android开发中使用自定义emoji表情代替系统默认表情)