2010-07-27 108 views
34

我的IM应用程序必须支持表情图标。它们是GIF并具有文本表示,如果用户选择其中的一个,则在输入框中使用它们。但是我想在发送它们之后将它们显示为图像。目前,我的自定义数组适配器在一行的TextView中显示发送的消息。在Android中显示表情符号

基于文本表示的出现动态显示图像的正确方法是什么?我是否需要搜索表情文本,如果发现,从布局中删除TextView(relativeLayout最适合?),然后添加一个带有IM开头的TextView,一个带有表情符号的ImageView和另一个TextView。如果同时发送更多的表情符号可能会变得混乱。

有没有更简单更合乎逻辑的方法?

+0

我在做类似的事情! http://stackoverflow.com/questions/16768930/implementations-of-emoji-emoticon-view-keyboard-layouts – toobsco42 2013-05-27 16:49:50

回答

38

我会尝试使用正则表达式以<img>标记替换所有出现的每个表情符号。然后,将该HTML转换为SpannedStringvia Html.fromHtml()SpannedString可用于TextView调用setText()

+2

这工作,非常感谢! – Diepie 2010-07-27 11:03:10

+0

可以请你帮忙把这个“5794d5f7895fa10a8f8e1357”转换成EMOJI ..请帮助我@CommonWare ..谢谢... – 2017-07-25 12:42:33

117

我认为这将是更有用的建立Spannable

private static final Factory spannableFactory = Spannable.Factory 
     .getInstance(); 

private static final Map<Pattern, Integer> emoticons = new HashMap<Pattern, Integer>(); 

static { 
    addPattern(emoticons, ":)", R.drawable.emo_im_happy); 
    addPattern(emoticons, ":-)", R.drawable.emo_im_happy); 
    // ... 
} 

private static void addPattern(Map<Pattern, Integer> map, String smile, 
     int resource) { 
    map.put(Pattern.compile(Pattern.quote(smile)), resource); 
} 

public static boolean addSmiles(Context context, Spannable spannable) { 
    boolean hasChanges = false; 
    for (Entry<Pattern, Integer> entry : emoticons.entrySet()) { 
     Matcher matcher = entry.getKey().matcher(spannable); 
     while (matcher.find()) { 
      boolean set = true; 
      for (ImageSpan span : spannable.getSpans(matcher.start(), 
        matcher.end(), ImageSpan.class)) 
       if (spannable.getSpanStart(span) >= matcher.start() 
         && spannable.getSpanEnd(span) <= matcher.end()) 
        spannable.removeSpan(span); 
       else { 
        set = false; 
        break; 
       } 
      if (set) { 
       hasChanges = true; 
       spannable.setSpan(new ImageSpan(context, entry.getValue()), 
         matcher.start(), matcher.end(), 
         Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
      } 
     } 
    } 
    return hasChanges; 
} 

public static Spannable getSmiledText(Context context, CharSequence text) { 
    Spannable spannable = spannableFactory.newSpannable(text); 
    addSmiles(context, spannable); 
    return spannable; 
} 

Actualy this code based on source from native from native Html class。

编辑:更新后的版本有戏剧性的速度提升。

+0

嗨,你可以请给我一些更多的代码,以更好地理解,谢谢你。 – amity 2011-09-09 09:08:39

+0

感谢A-IV,你的代码非常帮助我。 – amity 2011-09-09 09:46:16

+12

+1的真棒回答。 – 2012-04-09 12:12:12