不得不说 EaseUI 的 Android 表情包与 IOS 比起来是真的丑,就好像 IOS 已经在玩ps4的游戏了,Android 还在玩小霸王游戏机那种感觉。除了图片比较丑之外,Android 与 IOS 表情也并没有相对应,你可能会说,本来就不一样还怎么对应 W( ̄_ ̄)W。其实我想说,当你把表情按照一定规律都替换掉之后,会发现……还是有几个表情对不上,哈哈哈哈,下面我们就来详细分析一波。

1、icons 和 emojis

  当程序接受到表情消息时,通过在接受消息处 onCmdMessageReceived 打印日志或者打断点,可以发现收到的其实是一个表情符号。在Android中是通过表情符号对应相应的表情图片来进行显示的,而在IOS上只有一组表情符号,没有图片相对应,就是说IOS可以直接把这些特殊的符号显示成表情(大概经过了某些骚操作)。



  追踪这些符号,可以发现这些表情符号、表情图片的数组 iconsemojis 是被封装在了 EaseUIEaseDefaultEmojiconDatas 类中。

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-1ee-4ee-7ee-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,
            <!--……-->
复制代码