2010-07-27 20 views
34

Mi aplicación de IM debe admitir emoticones. Son GIF y tienen representaciones textuales, que se utilizan en el cuadro de entrada si el usuario selecciona una de ellas. Pero me gustaría mostrarlos como imágenes después de que se hayan enviado. Actualmente, mi adaptador de matriz personalizada muestra el mensaje enviado en una vista de texto de una fila.Mostrar emoticones en Android

¿Cuál es el método adecuado para mostrar imágenes dinámicamente en función de la aparición de su representación textual? ¿Tengo que buscar textos de emoticones y, si los encuentro, eliminar el TextView del diseño (relativeLayout se ajusta más?) Y agregar un TextView con el comienzo de la IM, una ImageView con el emoticón y otra TextView. Si se envían más emoticones simultáneamente, puede ser complicado.

¿Hay una manera más fácil y más lógica?

+0

¡Estoy haciendo algo similar AQUÍ! http://stackoverflow.com/questions/16768930/implementations-of-emoji-emoticon-view-keyboard-layouts – toobsco42

Respuesta

38

Intentaría usar una expresión regular para reemplazar todas las apariciones de cada emoticón con una etiqueta <img>. A continuación, convierta ese HTML en SpannedStringvia Html.fromHtml(). Ese SpannedString se puede utilizar en una llamada setText() en TextView.

+2

Eso funciona, ¡muchas gracias! – Diepie

+0

¿Puedes por favor ayudar a convertir este "5794d5f7895fa10a8f8e1357" en la EMOJI? Por favor, ayúdame @CommonWare. Gracias ... –

117

Creo que sería más útil construir 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; 
} 

Actualmente este código está basado en fuentes de la clase nativa Html.

Editar: La versión actualizada tiene una mejora de velocidad espectacular.

+0

Hola a-iv ¿puedes enviarme un poco más de código para que entiendas mejor? Gracias. – amity

+0

Gracias A-IV, su código me ayuda mucho. – amity

+12

+1 para una respuesta increíble. –

Cuestiones relacionadas