package edu.minggo.chat.util; import java.util.HashMap; import java.util.regex.Matcher; import java.util.regex.Pattern; import android.content.Context; import android.graphics.drawable.Drawable; import android.text.Spannable; import android.text.SpannableStringBuilder; import android.text.style.ImageSpan; import edu.minggo.chat.R; import edu.minggo.chat.model.Smiley; /** * ��������ͼƬ * @author minggo * @created 2013-2-18����02:30:11 */ public class SmileyParser { private static SmileyParser instance; public static SmileyParser getInstance() { return instance; } public static void init(Context context) { instance = new SmileyParser(context); } private static Context context; private static String[] smileyTexts; private static Pattern pattern; private static HashMap<String, Integer> smileyMap; @SuppressWarnings("static-access") private SmileyParser(Context context) { this.context = context; this.smileyTexts = context.getResources().getStringArray( R.array.default_smiley_name); this.smileyMap = buildSmileyToRes(); this.pattern = buildPattern(); } private HashMap<String, Integer> buildSmileyToRes() { System.out.println((Smiley.QQSIconIds.length+Smiley.EmjiIconIds.length)+"====="+smileyTexts.length); if ((Smiley.QQSIconIds.length+Smiley.EmjiIconIds.length) != smileyTexts.length) { throw new IllegalStateException("Smiley resource ID/text mismatch"); } HashMap<String, Integer> smileyToRes = new HashMap<String, Integer>( smileyTexts.length); for (int i = 0; i < smileyTexts.length; i++) { if(i<110) smileyToRes.put(smileyTexts[i], Smiley.QQSIconIds[i]); else if(110<=i&&i<230) smileyToRes.put(smileyTexts[i], Smiley.EmjiIconIds[i-110]); } return smileyToRes; } private Pattern buildPattern() { StringBuilder patternString = new StringBuilder(smileyTexts.length * 3); patternString.append('('); for (String s : smileyTexts) { patternString.append(Pattern.quote(s)); patternString.append('|'); } patternString.replace(patternString.length() - 1, patternString.length(), ")"); return Pattern.compile(patternString.toString()); } public CharSequence addSmileySpans(CharSequence text) { SpannableStringBuilder builder = new SpannableStringBuilder(text); Matcher matcher = pattern.matcher(text); while (matcher.find()) { int resId = smileyMap.get(matcher.group()); Drawable d = context.getResources().getDrawable(resId); d.setBounds(0, 0, 32, 32); ImageSpan span = new ImageSpan(d, matcher.group() + ".gif", ImageSpan.ALIGN_BOTTOM); //ImageSpan isp=new ImageSpan(context, resId); //isp.getDrawable().setBounds(0, 0, 10, 10);; builder.setSpan(span, matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } return builder; } public CharSequence addSmileySpansx(CharSequence text) { SpannableStringBuilder builder = new SpannableStringBuilder(text); Matcher matcher = pattern.matcher(text); while (matcher.find()) { int resId = smileyMap.get(matcher.group()); builder.setSpan(new ImageSpan(context, resId), matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } return builder; } }