android - compat - emoticons web
Mostrar emoticones en Android (2)
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.
¿Cuál es el método adecuado para mostrar imágenes dinámicamente en función de la ocurrencia 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 lógica?
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 Html
nativa.
Editar: la versión actualizada tiene una mejora de velocidad espectacular.
Intentaría usar una expresión regular para reemplazar todas las apariciones de cada emoticón con una etiqueta <img>
. Luego, SpannedString
en un SpannedString
través de Html.fromHtml()
. Ese SpannedString
se puede utilizar en una setText()
a setText()
en TextView
.