package com.wise.extend; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.wise.data.ChatEmoji; import com.wise.service.FileUtils; import com.wise.wawc.R; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.text.Spannable; import android.text.SpannableString; import android.text.TextUtils; import android.text.style.ImageSpan; import android.util.Log; /** * @author 王庆文 *表情轉換工具 */ public class FaceConversionUtil { /** 每一页表情的个数 */ private int pageSize = 20; private static FaceConversionUtil mFaceConversionUtil; /** 保存于内存中的表情HashMap */ private HashMap<String, String> emojiMap = new HashMap<String, String>(); /** 保存于内存中的表情集合 */ private List<ChatEmoji> emojis = null; /** 表情分页的结果集合 */ public List<List<ChatEmoji>> emojiLists = null; public static FaceConversionUtil getInstace() { if (mFaceConversionUtil == null) { mFaceConversionUtil = new FaceConversionUtil(); } return mFaceConversionUtil; } /** * 得到一个SpanableString对象,通过传入的字符串,并进行正则判断 * * @param context * @param str * @return */ public SpannableString getExpressionString(Context context, String str) { SpannableString spannableString = new SpannableString(str); // 正则表达式比配字符串里是否含有表情,如: 我好[开心]啊 String zhengze = "\\[[^\\]]+\\]"; // 通过传入的正则表达式来生成一个pattern Pattern sinaPatten = Pattern.compile(zhengze, Pattern.CASE_INSENSITIVE); try { dealExpression(context, spannableString, sinaPatten, 0); } catch (Exception e) { Log.e("dealExpression", e.getMessage()); } return spannableString; } /** * 添加表情 * * @param context * @param imgId * @param spannableString * @return */ public SpannableString addFace(Context context, int imgId, String spannableString) { if (TextUtils.isEmpty(spannableString)) { return null; } Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), imgId); bitmap = Bitmap.createScaledBitmap(bitmap, 35, 35, true); ImageSpan imageSpan = new ImageSpan(context, bitmap); SpannableString spannable = new SpannableString(spannableString); spannable.setSpan(imageSpan, 0, spannableString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); return spannable; } /** * 对spanableString进行正则判断,如果符合要求,则以表情图片代替 * * @param context * @param spannableString * @param patten * @param start * @throws Exception */ private void dealExpression(Context context, SpannableString spannableString, Pattern patten, int start) throws Exception { Matcher matcher = patten.matcher(spannableString); while (matcher.find()) { String key = matcher.group(); // 返回第一个字符的索引的文本匹配整个正则表达式,ture 则继续递归 if (matcher.start() < start) { continue; } String value = emojiMap.get(key); if (TextUtils.isEmpty(value)) { continue; } int resId = context.getResources().getIdentifier(value, "drawable", context.getPackageName()); if (resId != 0) { Bitmap bitmap = BitmapFactory.decodeResource( context.getResources(), resId); bitmap = Bitmap.createScaledBitmap(bitmap, 50, 50, true); // 通过图片资源id来得到bitmap,用一个ImageSpan来包装 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; } } } public void getFileText(Context context) { FileUtils fileUtils = new FileUtils(); ParseData(fileUtils.getEmojiFile(context), context); } /** * 解析字符 * * @param data */ private void ParseData(List<String> data, Context context) { if (data == null) { Log.e("读取的文件为空","读取的文件为空"); return; } if(emojiLists == null){ emojiLists = new ArrayList<List<ChatEmoji>>(); }else{ emojiLists.clear(); } if(emojis == null){ emojis = new ArrayList<ChatEmoji>(); }else{ emojis.clear(); } ChatEmoji emojEentry; try { for (String str : data) { String[] text = str.split(","); String fileName = text[0].substring(0, text[0].lastIndexOf(".")); emojiMap.put(text[1], fileName); int resID = context.getResources().getIdentifier(fileName,"drawable", context.getPackageName()); if (resID != 0) { emojEentry = new ChatEmoji(); emojEentry.setId(resID); emojEentry.setCharacter(text[1]); emojEentry.setFaceName(fileName); emojis.add(emojEentry); } } int pageCount = (int) Math.ceil(emojis.size() / 20 + 0.1); for (int i = 0; i < pageCount; i++) { emojiLists.add(getData(i)); } } catch (Exception e) { e.printStackTrace(); } } /** * 获取分页数据 * * @param page * @return */ private List<ChatEmoji> getData(int page) { int startIndex = page * pageSize; int endIndex = startIndex + pageSize; if (endIndex > emojis.size()) { endIndex = emojis.size(); } // 不这么写,会在viewpager加载中报集合操作异常,我也不知道为什么 List<ChatEmoji> list = new ArrayList<ChatEmoji>(); list.addAll(emojis.subList(startIndex, endIndex)); if (list.size() < pageSize) { for (int i = list.size(); i < pageSize; i++) { ChatEmoji object = new ChatEmoji(); list.add(object); } } if (list.size() == pageSize) { ChatEmoji object = new ChatEmoji(); object.setId(R.drawable.face_del_icon); list.add(object); } return list; } }