sogo 输入法等输入表情,在程序中如何转化为可上传为服务器的字符串,以及从服务器取下字符串如何转化成表情显示

因为emoji是有表情分组的,所以你要优先考虑解析出来的也是分好组的。

HashMap> emoMap = new HashMap>();

我是这么来分组的。

解析xml,然后把2600这样的字符串转换成unicode。这个很关键,映射对应不上肯定也解析不出来。要注意的一点是有的emoji是两个unicode组成的  U+1F1F0 U+1F1F7  这样。。所以么。又多了一个环节。

HashMap, String> convertMap = new HashMap, String>();

再定义一个map来存unicode和string字符的映射。

解析emoji.xml文件,获取表情分组

public void readMap(Context mContext) {

if (convertMap == null || convertMap.size() == 0) {

convertMap = new HashMap, String>();

XmlPullParser xmlpull = null;

String fromAttr = null;

String key = null;

ArrayList emos = null;

try {

XmlPullParserFactory xppf = XmlPullParserFactory.newInstance();

xmlpull = xppf.newPullParser();

InputStream stream = mContext.getAssets().open("emoji.xml");

xmlpull.setInput(stream, "UTF-8");

int eventCode = xmlpull.getEventType();

while (eventCode != XmlPullParser.END_DOCUMENT) {

switch (eventCode) {

case XmlPullParser.START_DOCUMENT: {

break;

}

case XmlPullParser.START_TAG: {

if (xmlpull.getName().equals("key")) {

emos = new ArrayList();

key = xmlpull.nextText();

}

if (xmlpull.getName().equals("e")) {

fromAttr = xmlpull.nextText();

emos.add(fromAttr);

List fromCodePoints = new ArrayList();

if (fromAttr.length() > 6) {

String[] froms = fromAttr.split("\\_");

for (String part : froms) {

fromCodePoints.add(Integer.parseInt(part, 16));

}

} else {

fromCodePoints.add(Integer.parseInt(fromAttr, 16));

}

convertMap.put(fromCodePoints, fromAttr);

}

break;

}

case XmlPullParser.END_TAG: {

if (xmlpull.getName().equals("dict")) {

emoMap.put(key, emos);

}

break;

}

case XmlPullParser.END_DOCUMENT: {

Log.d("", "parse emoji complete");

break;

}

}

eventCode = xmlpull.next();

}

} catch (Exception e) {

Log.e(TAG, e.toString(), e);

}

}

}

输入内容解析为 字符串,即可上传至服务器

public String parseEmoji(String input) {

if (input == null || input.length() <= 0) {

return "";

}

StringBuilder result = new StringBuilder();

int[] codePoints = toCodePointArray(input);

List key = null;

for (int i = 0; i < codePoints.length; i++) {

key = new ArrayList();

if (i + 1 < codePoints.length) {

key.add(codePoints[i]);

key.add(codePoints[i + 1]);

if (convertMap.containsKey(key)) {

String value = convertMap.get(key);

if (value != null) {

result.append("[e]" + value + "[/e]");

}

i++;

continue;

}

}

key.clear();

key.add(codePoints[i]);

if (convertMap.containsKey(key)) {

String value = convertMap.get(key);

if (value != null) {

result.append("[e]" + value + "[/e]");

}

continue;

}

result.append(Character.toChars(codePoints[i]));

}

return result.toString();

}

服务器获取的表情字符串 需要转化成图片表情 ,根据表情id 找到对应图片

/**

* 对spanableString进行正则判断,如果符合要求,则以表情图片代替

*/

public static void dealExpression(Context context, SpannableString spannableString, Pattern patten, int start)

throws Exception {

Matcher matcher = patten.matcher(spannableString);

while (matcher.find()) {

String key = matcher.group();

Log.d("Key", key);

if (matcher.start() < start) {

continue;

}

Field field = R.drawable.class.getDeclaredField("emoji_"

+ key.substring(key.indexOf("]") + 1, key.lastIndexOf("[")));

int resId = Integer.parseInt(field.get(null).toString());

if (resId != 0) {

Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), resId);

ImageSpan imageSpan = new ImageSpan(bitmap);

int end = matcher.start() + key.length();

spannableString.setSpan(imageSpan, matcher.start(), end, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

if (end < spannableString.length()) {

dealExpression(context, spannableString, patten, end);

}

break;

}

}

}

android 表情转化,android 表情emoil转化相关推荐

  1. 【Android】显示Emoji表情字符

    一.下载AndroidEmoji.ttf字体 地址1:Github Android Platform 地址2:AndroidEmoji.ttf.zip 二.使用 2.1 将字体拷贝到assets/fo ...

  2. android表情输入键盘,GitHub - UKfire/Emotion: 帮你的Android应用快速集成表情键盘

    ##Emotion 帮你快速集成Android表情键盘,让你的应用不止文字,让表情跳动起来 ##It looks Cool ##Usage Download ZIP,然后解压,将emoji包添加到自己 ...

  3. android 自定义表情包,android基于环信的聊天和表情自定义

    环信sdk的导入 自定义聊天界面 此处只有静态图,请谅解. 自定义表情发送 自定义聊天界面 简单说下自定义的聊天界面,一个带有recyclerview和的xml文件,和对应的adapter即可.rec ...

  4. android高仿微信表情输入与键盘输入详解-解决跳闪与表情切换问题

    最近公司在项目上要使用到表情与键盘的切换输入,自己实现了一个,还是存在些缺陷,比如说键盘与表情切换时出现跳闪问题,这个相当困扰我,不过所幸在Github(其中一个不错的开源项目是https://git ...

  5. android高仿微信表情输入与键盘输入(详细实现分析)

    转载请注明出处(请尊重原创!谢谢~): http://blog.csdn.net/javazejian/article/details/52126391 出自[zejian的博客]   表情与键盘的切 ...

  6. IM界面高仿微信,android表情转ios表情,支持自定义表情,支持语音(实战界面)

    前言: 2018年底由子公司来到现在的集团公司,从互联网公司变成了企业公司.在最近一个项目里,做的辛辛苦苦,功能又被砍了.没有理由,心力交瘁!本来是打算自己做IM的,现在被砍了.我就把本地功能贡献出来 ...

  7. Android IOS风格Emoji表情,简单实用

    相信大家做项目的时候,特别是聊天相关的,一般都需要用到Emoji. 但是Emoji表情在安卓和IOS两个平台上,显示效果是不一样的,如下图: 言归正传,大家都知道,Emoji就是一组Unicode编码 ...

  8. Android UI【android 仿微信、QQ聊天,带表情,可翻页,带翻页拖动缓冲】

    如题,这是公司项目的一个功能模块,先上个效果图: 其次大致说说原理: 1,首先判断输入的字符,是否包含表情的文字,比如   这个表情对应的文件名为 emoji_1.png,它对应的文字描述 : [可爱 ...

  9. Android 模仿手机QQ表情输入和表情预览框

    闲来无事花了一点空暇时间写了一个模仿Android版手机QQ的表情输入框 效果图如下 实现步骤 一:布局 二:录入填充表情 三:监听表情的适配器的触摸监听显示出预览框 一 .布局 我是自己自定一个Ex ...

最新文章

  1. 移动端网站优化也不容小觑!
  2. Entity Framework中的Migrations
  3. XShell上无法通过rz上传空文件,通过新建文件来实现
  4. 手机技巧:是否应该一次性给手机充电到100%?看完你就明白了!
  5. Servlet 流程控制
  6. mysql 多值属性_数据库 名词解释:单值属性和多值属性
  7. 华强北二手手机卖不出去,闲鱼砸一亿现金帮扶
  8. ftp 上传档案到主机 OMVS
  9. 区块链100问41-60问
  10. C# 连接 SQL Server 数据库,出现异常:provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接...
  11. gerber文件怎么导贴片坐标_怎么用CAM350从Gerber中提取SMT元件贴片坐标-CAM350教程...
  12. 软件测试职业比赛,我院首届软件测试职业技能大赛圆满落幕
  13. 高版本linux安装gamit,Ubuntu14下Gamit安装(示例代码)
  14. 《东周列国志》第四十三回 智宁俞假鸩复卫 老烛武缒城说秦
  15. Android关于网络访问app应用开发相关的异常总结
  16. SQL存储过程使用介绍
  17. 数据库只读问题解决!!!MySQL server is running with the --read-only option
  18. Oracle中实现分页
  19. vue传值给子页面html,vue.js如何父传子?
  20. 推荐程序员面试秘籍!抖音Java后端123面开挂,太牛了!

热门文章

  1. 多条件求和--sum 和 sumifs 结合
  2. windows下 python3 安装channels报错
  3. jupyter notebook代码运行一直没有反应, 只显示*号
  4. jpa 动态sql拼接_jpa 如何优雅的实现动态sql
  5. linux服务器安装warp-ctc
  6. Android中启动一个服务,Android服务的两种启动方式
  7. java-php-python-ssm雷士灯具管理系统计算机毕业设计
  8. html设置距离页面上距离,html上下间距怎么调
  9. 自然语言处理——word2vec项目实战—— NLP理论基础
  10. 我的Android成长之路(9)----黑科技dataBinding(二)