2010-07-27 6 views
34

Мое приложение для IM должно поддерживать смайлики. Они являются GIF и имеют текстовые представления, которые используются в поле ввода, если пользователь выбирает один из них. Но я бы хотел отобразить их как изображения после их отправки. В настоящее время мой пользовательский адаптер массива отображает отправленное сообщение в TextView строки.Отображение смайликов в Android

Каков оптимальный способ отображения изображений динамически в зависимости от наличия их текстового представления? Нужно ли искать тексты для смайликов, и если вы нашли, удалите TextView из макета (relativeLayout подходит больше всего?) И добавьте TextView с началом IM, ImageView с смайликом и другим TextView. Если одновременно будет выпущено больше смайликов, это может быть беспорядочно.

Есть ли более простой и логичный способ?

+0

Я делаю что-то подобное ЗДЕСЬ !!! http://stackoverflow.com/questions/16768930/implementations-of-emoji-emoticon-view-keyboard-layouts – toobsco42

ответ

38

Я бы попытался использовать регулярное выражение, чтобы заменить все вхождения каждого смайлика тегом <img>. Затем преобразуйте этот HTML-код в SpannedStringvia Html.fromHtml(). То, что SpannedString может использоваться в звонке setText() по телефону TextView.

+2

Это работает, спасибо большое! – Diepie

+0

Можете ли вы, пожалуйста, помочь преобразовать этот «5794d5f7895fa10a8f8e1357» в EMOJI .. Пожалуйста, помогите мне @CommonWare .. Спасибо ... –

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; 
} 

Этот код основано на источниках из родных Html класса.

Редактировать: Обновленная версия имеет значительное улучшение скорости.

+0

Привет, вы можете отправить мне еще код, чтобы лучше понять, спасибо. – amity

+0

Спасибо A-IV, ваш код мне очень помогает. – amity

+12

+1 за потрясающий ответ. –

 Смежные вопросы

  • Нет связанных вопросов^_^