亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在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 關注
  • 475 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號