不得不说 EaseUI 的 Android 表情包与 IOS 比起来是真的丑,就好像 IOS 已经在玩ps4的游戏了,Android 还在玩小霸王游戏机那种感觉。除了图片比较丑之外,Android 与 IOS 表情也并没有相对应,你可能会说,本来就不一样还怎么对应 W( ̄_ ̄)W。其实我想说,当你把表情按照一定规律都替换掉之后,会发现……还是有几个表情对不上,哈哈哈哈,下面我们就来详细分析一波。
1、icons 和 emojis
当程序接受到表情消息时,通过在接受消息处 onCmdMessageReceived 打印日志或者打断点,可以发现收到的其实是一个表情符号。在Android中是通过表情符号对应相应的表情图片来进行显示的,而在IOS上只有一组表情符号,没有图片相对应,就是说IOS可以直接把这些特殊的符号显示成表情(大概经过了某些骚操作)。
追踪这些符号,可以发现这些表情符号、表情图片的数组 icons 、emojis 是被封装在了 EaseUI 的 EaseDefaultEmojiconDatas 类中。
2、替换表情
找到表情所在的位置之后,开始替换表情。首先看一下IOS的表情库(实际上有两页):
这里先说一句抱歉,因为我找了半天表情图,最终还是有几个表情与 IOS 不一样。所以先让 IOS 的同学把不一样的表情注释掉。
这些就是共同的表情库了,先导入项目中。这里发一下
3、找规律(可跳过)
先通过 IOS 向 Android 设备发送第一行表情
对比一下 EaseSmileUtils 中的表情符号:
public class EaseSmileUtils {
public static final String DELETE_KEY = "em_delete_delete_expression";
public static final String ee_1 = "[):]";
public static final String ee_2 = "[:D]";
public static final String ee_3 = "[;)]";
public static final String ee_4 = "[:-o]";
public static final String ee_5 = "[:p]";
public static final String ee_6 = "[(H)]";
public static final String ee_7 = "[:@]";
public static final String ee_8 = "[:s]";
public static final String ee_9 = "[:$]";
public static final String ee_10 = "[:(]";
……
}
复制代码
我们可以发现 IOS 发过来的表情符号分别对应 ee-1、ee-4、ee-7、ee-10,中间都隔了两个。为什么会隔两个呢?再看一眼 IOS 表情库一共是有3行,会不会是跳过了下面的两行呢? 我们再通过 IOS 设备发送第1列表情。
可以看出对 Android 来说,IOS 真的是按照竖着的顺序排列表情的。如果我们按照这个顺序在 Icons 数组中添加图片的话,还需要删除一个符号 ee_17 = "[<o)]",然后重新排一下序号。 这样 IOS 和 Android 的表情就可以一一对应上,但是表情库一个是横着排,一个是竖着排,所以下面是最终方案。
4、最终方案
为了统一表情库的排列顺序,需要更改 EaseSmileUtils 数组中表情符号与 IOS 排列顺序一致,然后图片与符号相对应即可。
public class EaseSmileUtils {
public static final String DELETE_KEY = "em_delete_delete_expression";
public static final String ee_1 = "[):]";
public static final String ee_2 = "[:-o]";
public static final String ee_3 = "[:@]";
public static final String ee_4 = "[:(]";
public static final String ee_5 = "[(a)]";
public static final String ee_6 = "[+o(]";
public static final String ee_7 = "[:-#]";
public static final String ee_8 = "[:D]";
public static final String ee_9 = "[:p]";
public static final String ee_10 = "[:s]";
public static final String ee_11 = "[:'(]";
public static final String ee_12 = "[8o|]";
public static final String ee_13 = "[|-)]";
public static final String ee_14 = "[^o)]";
public static final String ee_15 = "[;)]";
public static final String ee_16 = "[(H)]";
public static final String ee_17 = "[:$]";
public static final String ee_18 = "[:|]";
public static final String ee_19 = "[8-|]";
public static final String ee_20 = "[*-)]";
……
}
复制代码
private static int[] icons = new int[]{
R.drawable.emoji_1,
R.drawable.emoji_2,
R.drawable.emoji_3,
R.drawable.emoji_4,
R.drawable.emoji_5,
R.drawable.emoji_6,
R.drawable.emoji_7,
R.drawable.emoji_8,
R.drawable.emoji_9,
R.drawable.emoji_10,
R.drawable.emoji_11,
R.drawable.emoji_12,
R.drawable.emoji_13,
R.drawable.emoji_14,
R.drawable.emoji_15,
R.drawable.emoji_16,
R.drawable.emoji_17,
R.drawable.emoji_18,
R.drawable.emoji_19,
R.drawable.emoji_20,
<!--……-->
复制代码