由于使用融云集成聊天,一个端集成了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