您当前的位置: 首页 > 

xiangzhihong8

暂无认证

  • 2浏览

    0关注

    1324博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

仿微信聊天表情发送

xiangzhihong8 发布时间:2014-04-06 17:34:18 ,浏览量:2

如题,这是公司项目的一个功能模块,先上个效果图:

其次大致说说原理:

1,首先判断输入的字符,是否包含表情的文字,比如   这个表情对应的文件名为 emoji_1.png,它对应的文字描述 : [可爱],如果我们在输出的是输出这么一句话:老婆,我想你了。  那么我们对应的根本文字就是:老婆,我想你了[可爱]。

2,具体的转换过程就是用正则表达式比配文字中是否含有[xxx]这类的文字,如果有,那么我们就根据拿到的[xxx]找到它对应的资源文件id,当然这其中有一个关系表,看你怎么处理这个关系了。最后将其用SpannableString替换成文字,表面上显示有图片,其实TextView里的text依然是:老婆,我想你了[可爱]。这个过程明白么?

下面贴上DEMO工程的结构:

再贴上几个重要的类:

[java] view plain copy print ?
  1. package com.example.facedemo;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.List;  
  6. import java.util.regex.Matcher;  
  7. import java.util.regex.Pattern;  
  8.   
  9. import android.content.Context;  
  10. import android.graphics.Bitmap;  
  11. import android.graphics.BitmapFactory;  
  12. import android.text.Spannable;  
  13. import android.text.SpannableString;  
  14. import android.text.TextUtils;  
  15. import android.text.style.ImageSpan;  
  16. import android.util.Log;  
  17.   
  18. /** 
  19.  *  
  20.  ******************************************  
  21.  * @author 廖乃波 
  22.  * @文件名称 : FaceConversionUtil.java 
  23.  * @创建时间 : 2013-1-27 下午02:34:09 
  24.  * @文件描述 : 表情轉換工具 
  25.  ******************************************  
  26.  */  
  27. public class FaceConversionUtil {  
  28.   
  29.     /** 每一页表情的个数 */  
  30.     private int pageSize = 20;  
  31.   
  32.     private static FaceConversionUtil mFaceConversionUtil;  
  33.   
  34.     /** 保存于内存中的表情HashMap */  
  35.     private HashMap emojiMap = new HashMap();  
  36.   
  37.     /** 保存于内存中的表情集合 */  
  38.     private List emojis = new ArrayList();  
  39.   
  40.     /** 表情分页的结果集合 */  
  41.     public List emojiLists = new ArrayList();  
  42.   
  43.     private FaceConversionUtil() {  
  44.   
  45.     }  
  46.   
  47.     public static FaceConversionUtil getInstace() {  
  48.         if (mFaceConversionUtil == null) {  
  49.             mFaceConversionUtil = new FaceConversionUtil();  
  50.         }  
  51.         return mFaceConversionUtil;  
  52.     }  
  53.   
  54.     /** 
  55.      * 得到一个SpanableString对象,通过传入的字符串,并进行正则判断 
  56.      *  
  57.      * @param context 
  58.      * @param str 
  59.      * @return 
  60.      */  
  61.     public SpannableString getExpressionString(Context context, String str) {  
  62.         SpannableString spannableString = new SpannableString(str);  
  63.         // 正则表达式比配字符串里是否含有表情,如: 我好[开心]啊  
  64.         String zhengze = "\\[[^\\]]+\\]";  
  65.         // 通过传入的正则表达式来生成一个pattern  
  66.         Pattern sinaPatten = Pattern.compile(zhengze, Pattern.CASE_INSENSITIVE);  
  67.         try {  
  68.             dealExpression(context, spannableString, sinaPatten, 0);  
  69.         } catch (Exception e) {  
  70.             Log.e("dealExpression", e.getMessage());  
  71.         }  
  72.         return spannableString;  
  73.     }  
  74.   
  75.     /** 
  76.      * 添加表情 
  77.      *  
  78.      * @param context 
  79.      * @param imgId 
  80.      * @param spannableString 
  81.      * @return 
  82.      */  
  83.     public SpannableString addFace(Context context, int imgId,  
  84.             String spannableString) {  
  85.         if (TextUtils.isEmpty(spannableString)) {  
  86.             return null;  
  87.         }  
  88.         Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),  
  89.                 imgId);  
  90.         bitmap = Bitmap.createScaledBitmap(bitmap, 35, 35, true);  
  91.         ImageSpan imageSpan = new ImageSpan(context, bitmap);  
  92.         SpannableString spannable = new SpannableString(spannableString);  
  93.         spannable.setSpan(imageSpan, 0, spannableString.length(),  
  94.                 Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
  95.         return spannable;  
  96.     }  
  97.   
  98.     /** 
  99.      * 对spanableString进行正则判断,如果符合要求,则以表情图片代替 
  100.      *  
  101.      * @param context 
  102.      * @param spannableString 
  103.      * @param patten 
  104.      * @param start 
  105.      * @throws Exception 
  106.      */  
  107.     private void dealExpression(Context context,  
  108.             SpannableString spannableString, Pattern patten, int start)  
  109.             throws Exception {  
  110.         Matcher matcher = patten.matcher(spannableString);  
  111.         while (matcher.find()) {  
  112.             String key = matcher.group();  
  113.             // 返回第一个字符的索引的文本匹配整个正则表达式,ture 则继续递归  
  114.             if (matcher.start() 
关注
打赏
1482932726
查看更多评论
立即登录/注册

微信扫码登录

0.1003s