从早上搞到现在,才终于解决的,最后发现这个功能其实很容易实现,只是java的正则用的少Matcher和Pattern不够熟悉,才导致绕了很大的弯
有几点是需要明白的
一,String是根据编码解析从而得到字符的,我们的emoji是一张小小的位图的char
二,切入主题
1.安卓客服端显示emoji,这个不难,只要从位图解析图片后交给imageSpan然后替换掉SpannableString中的字符得到CharSequence
例子
输入到edittext中
ImageSpan imageSpan = new ImageSpan(UserTallGallery.this,BitmapFactory.decodeResource(getResources(),(AppData.getweiBoface())[position]));
SpannableString spannableString = new SpannableString("face");
spannableString.setSpan(imageSpan, 0, spannableString.length(),SpannableString.SPAN_MARK_MARK);
sendTextContainter.append(spannableString);
注:sendTextContainter是edittext
当我们点击发送时就要把edittext的东东放到panel了,如textview
这里需要注意的是我们的edittext是包含emoji表情的,所以在获取时不能tostring哦,不然就让String用字符编码解析了,结果肯定导致emoji表情丢失
例子
serTallGalleryBean.setSendContent(new SpannableString(sendTextContainter.getText()));
用Spannable来构造,其实直接塞给
CharSequence的引用就ok了,
2.接下来的步骤就重要了,我们要发含emoji的文字给服务器,说笑的,怎么可能直接发emoji呢,我们用一个替换符来替换,其实就是上面的
SpannableString spannableString = new SpannableString("face");
就是face了,当然我们要标志不同的emoji就用其他的,如
SpannableString spannableString = new SpannableString("[wbface("+position+")]");//方便格式化表情
完毕,数据可以保存到mysql了,
接下来就从mysql得到数据并还原成带表情的文字
Pattern pattern = Pattern.compile("\\[wbface\\(\\d+\\)\\]");
Matcher matcher = pattern.matcher(listTheme.get(position).getTheme_textcontent());
SpannableString spannableString = new SpannableString(listTheme.get(position).getTheme_textcontent());//方便格式化表情
while(matcher.find()){
String str = matcher.group(0);
int index = Integer.parseInt(str.substring(str.indexOf("(")+1, str.indexOf(")")));
// 输入表情
ImageSpan imageSpan = new ImageSpan(mcontext,BitmapFactory.decodeResource(mcontext.getResources(),(AppData.getweiBoface())[index]));
spannableString.setSpan(imageSpan, matcher.start(0), matcher.end(0), SpannableString.SPAN_MARK_MARK);
}
由于我们的表情只是一个一个的正则出来,所以
String str = matcher.group(0);
就是一个表情了,接下来用emoji图片替换就ok了