android 表情转化,android 表情emoil转化

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;

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值