2010-07-27 8 views
34

내 IM 앱이 이모티콘을 지원해야합니다. 그것들은 GIF이고 텍스트 표현을 가지고 있는데, 사용자가 그 중 하나를 선택하면 입력 상자에서 사용됩니다. 하지만 내가 보낸 후에 이미지로 표시하고 싶습니다. 현재 사용자 지정 배열 어댑터는 보낸 메시지를 한 행의 TextView에 표시합니다.Android에서 이모티콘 표시

텍스트 표현의 발생을 기반으로 이미지를 동적으로 표시하는 적절한 방법은 무엇입니까? 이모티콘 텍스트를 검색해야합니다. 찾은 경우 레이아웃에서 TextView를 제거하고 (relativeLayout이 가장 적합합니까?) IM의 시작 부분에 TextView를 추가하고 이모티콘과 다른 TextView가있는 ImageView를 추가하십시오. 더 많은 이모티콘이 동시에 전송되면 지저분해질 수 있습니다.

더 쉽고 논리적 인 방법이 있습니까?

+0

나는 비슷한 것을하고있다 !!! http://stackoverflow.com/questions/16768930/implementations-of-emoji-emoticon-view-keyboard-layouts – toobsco42

답변

38

정규식을 사용하여 각 이모티콘의 모든 항목을 <img> 태그로 바꾸어 봅니다. 그런 다음 해당 HTML을 SpannedStringvia Html.fromHtml()으로 변환하십시오. 그 SpannedStringsetText() 전화 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

안녕하세요 a-iv 더 나은 감사를 이해하기 위해 더 많은 코드를 보내주십시오. – amity

+0

A-IV에 감사드립니다. 코드가 도움이되었습니다. – amity

+12

+1 멋진 답변. –

관련 문제