Android Emoji的处理

来源:互联网 发布:数据库可以存图片吗 编辑:程序博客网 时间:2024/05/16 16:06

一、Emoji的前世今生

1、Emoji的诞生

Emoji表情是一种视觉上的速记符号,最初是在1999年由一个名叫Shigetaka Kurita(栗田穣崇)的日本人发明的。
而后随着发展,出现了统一码联盟(The Unicode Consortium),它的主要工作就是统筹统一码(Unicode)的发展。

作为一种字符编码,Unicode的出现主要是为了解决现存编码不能够在多语言电脑环境中使用的问题。Unicode对世界上大部分的文字系统进行了整理、编码,使得电脑可以用更为简单的方式来呈现和处理文字,这当然也包括Emoji。

The Unicode Consortium 会按照一定的节奏来更新 Unicode 的标准,目前最新的标准是今年发布的Unicode 9.0。

当我们发现某个非常喜欢的动作或物品时,而它又没有出现在现有的Emoji库中,那我们可以到Unicode官网或通过The Unicode Consortium的成员去提交这个Emoji;接着,The Unicode Consortium的Emoji小组委员会会根据一系列的标准来讨论并评审这个Emoji,以决定它适不适合被选中。

当一个Emoji通过The Unicode Consortium的评审成为标准之后,它还只是停留在文件上,还需要系统开发商(比如苹果、Google等)在系统字体层面进行支持才行。

2、世界Emoji日

每年的7月17日是世界Emoji日。

二、Emoji表情怎么创建的?

emoji就是一组Unicode编码与一组表情描述之间的一一对应。而图片的实现是由各个系统或者软件针对统一的表情描述来各自实现的,他们都遵循统一的Unicode编码规范。也就是说Unicode编码其所对应的表情描述是统一的,是所有人都要共同遵守的一套标准或者规范,而具体的表情图片则可能因平台的不同而产生差异,比如Android和iOS。

先看下Emoji表情的编码http://apps.timwhitlock.info/emoji/tables/unicode。如图:
这里写图片描述

对于Unicode编码为”U+1F602”的表情,各个平台分别做了不同的实现。

三、Emoji在Android中的使用

对于一般用户来说,我们可以通过安装第三方输入法来进行Emoji表情的输入,但对于我们写程序的人来说,总不能这样吧。

So,既然Emoji表情是通过Unicode编码实现的,那我们就可以使用Character.toChars()方法将Unicode编码转换为一个char数组,再将这个char数组转换为字符串就可以直接操作了,操作系统会自行将其解析为表情图片的,然后显示在文本组件中。

代码实现:

private void setEmojiToTextView(){
int unicodeJoy = 0x1F602;
String emojiString = getEmojiStringByUnicode(unicodeJoy);
myTextView.setText(emojiString);
}

private String getEmojiStringByUnicode(int unicode){
return new String(Character.toChars(unicode));
}

当然,这只是其中的一种方法,我们还可以通过Emoji字体库来实现效果,将制作好Emoji字体库拷贝到Android工程的assets/fonts目录,然后代码中进行处理:

try {
Typeface typeFace = Typeface.createFromAsset(getResources().getAssets(),”fonts/AndroidEmoji.ttf”);
title.setTypeface(typeFace);
} catch (Exception e) {
Logger.e(e);
}

之后,当我们在该title控件上输入Emoji表情的Unicode后会自动转换为表情图片。

对于早期的Android系统(Android 4.1之前)而言,它本身并不支持Emoji的显示,这种情况下我们可以实现一个表情管理类,然后使用Emoji图片来进行显示。

若是要显示全局彩色的Emoji,我们可以编写一个全局显示Emoji的类来继承TextView或EditText,这样方便管理,当然,这么好东西网上早就有了,请移步Emoji库:https://github.com/rockerhieu/emojicon,基本上可以覆盖常用的操作了。

最后在项目开发中,尤其是聊天应用开发中,我们通常需要做的是把消息中含有的unified的emoji编码过滤出来,然后映射出对应的表情资源,并显示出来。发送Emoji时也是一样,先找到对应的Unicode码,再传送过去。

还有需要注意的是,Android端和IOS端的表情显示默认是不一样的,所以为了达到体验的一致,Android和IOS应该通用一套同样的Emoji表情图片。再者,对于不在自己代码定义的范围内的emoji需要过滤掉,类似微信的做法。

最后,在Android的聊天页面进行Emoji表情的选择时,我们也需要注意:

emoji库是通过不断对比map里面的数据来查询的,会导致在列表中过多的Emoji滚动时会很卡。解决办法是:在得到列表json数据的时候,在映射的时候就转码成emoji,并将该emoji直接放入实体。这样就避免了滚动list的时候转码带来的卡顿!

在输入emoji的地方(发表内容),连续输入多个emoji会卡顿甚至卡死,原因同上,因为这个库是对比查找的,默认的算法是假如有1000个emoji,那么就1个emoji的key对比1000次,而输入的时候由于每次输入都进行了转码,所以输入一个emoji就要对整段text进行emoji对比。性能严重下滑!解决办法是改变自己的算法,只转码新输入的那个字符。

1 0