IT_Programming/Android_Java

[Android] 정규식과 ImageSpan을 활용해 괄호 안 문자 이미지로 변경하기

JJun ™ 2014. 7. 16. 05:00

 


 출처: http://colib.tistory.com/m/post/7


 

안드로이드에서는 TextView나 EditText에 간혹 이모티콘과 같은 이미지를 삽입해야할 필요가 있다.

Html을 이용하는 방법도 있겠지만 좀더 복잡하거나 다양한 이미지를 삽입하기 위해서는

아래와 같이 정규식과 ImageSapn을 이용하면 해결할 수 있다.

 

 public SpannableString changeToEmoticon(Context context, String text)
{
        SpannableString result = new SpannableString(text);
        Pattern pattern = Pattern.compile("\\((.*?)\\)"); // 괄호안의 문자를 가져오는 정규식
        Matcher match = pattern.matcher(text);


        while (match.find()) // 문장에 포함된 모든 괄호 문자를 이미지로 변경
        {
                int start = match.start();
                int end = match.end();
                int path = DBPool.getInstance(context).getImagePath(match.group(1));


                String temp = match.group(1); // temp가 괄호안 문자를 참조         
               while(temp.contains("(")) // 괄호안에 괄호가 있는 경우에 앞의 괄호들 제거
                {
                        start = start + temp.indexOf("(") + 1;
                        temp = temp.substring( temp.indexOf("(") + 1 );
                }

 

                // 해당 문자가 DB에 존재하는 문자인지 확인
                path = DBPool.getInstance(context).getImagePath(temp); 
                if (path != 0) 
                {
                        Drawable drawable = context.getResources()
                                      .getDrawable(context.getResources()
                                      .getIdentifier(String.format("sticker_img_%d", path)
                                           , "drawable", context.getPackageName()));


                        drawable.setBounds(0, 0, drawable.getIntrinsicWidth()/2
                                                             , drawable.getIntrinsicHeight()/2); 
                       

                        // ImageSpan을 이용한 이미지 변경

                        result.setSpan(new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE)
                                      , start, end, SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);
                }
        }

        return result;
}