为了账号安全,请及时绑定邮箱和手机立即绑定

在Android中显示图释

在Android中显示图释

料青山看我应如是 2019-12-09 15:28:04
我的IM应用必须支持表情符号。它们是GIF并具有文本表示形式,如果用户选择其中之一,则会在输入框中使用它们。但是我想在发送后将它们显示为图像。当前,我的自定义数组适配器在一行的TextView中显示已发送的消息。有什么合适的方法可以根据文本表示形式动态显示图像?我是否必须搜索表情符号文本,如果找到了,请从布局中删除TextView(relativeLayout最适合吗?),然后在IM的开头添加一个TextView,一个带有表情符号的ImageView和另一个TextView。如果同时发送更多表情符号,可能会造成混乱。有没有更简单,更合乎逻辑的方法?
查看完整描述

3 回答

?
www说

TA贡献1775条经验 获得超8个赞

我会尝试使用正则表达式用<img>标签替换每个表情符号的所有出现。然后,将该HTML转换为SpannedString viaHtml.fromHtml()。这SpannedString可以被用在setText()呼叫TextView。


查看完整回答
反对 回复 2019-12-09
?
芜湖不芜

TA贡献1796条经验 获得超7个赞

我认为构建会更有用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类的源代码。


查看完整回答
反对 回复 2019-12-09
?
慕标琳琳

TA贡献1830条经验 获得超9个赞

如果您使用而不是使用来获取可绘制对象的每个外观的克隆,则似乎不需要整个内部for循环和删除先前的跨度。entry.getValue()entry.getValue().getConstantState().newDrawable()

查看完整回答
反对 回复 2019-12-09
  • 3 回答
  • 0 关注
  • 404 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信