2013-06-01 79 views
0

我有一个聊天应用程序,我想用表情符号来扩展。将drawable转换为特定字符串

这个代码用在文本中插入一个表情符号:

Spanned cs = Html.fromHtml("<img src ='"+ index +"'/>", imageGetter, null);  

    int cursorPosition = content.getSelectionStart();   
    content.getText().insert(cursorPosition, cs); 

这是伟大的工作。表情符号显示在正确的地方。

现在我想通过HTTP将文本发送到我的服务器。 我想存储“:)”而不是图像,而使用较旧的应用程序版本则无法显示图像。在新版本中,我在显示文本之前将“:)”转换为图像。有什么办法将图像转换为特定的字符串?

如果要更换你的表情
+0

是表情符号可绘制的资源? R.drawable.something? – Blackbelt

+0

我有他们在资产和可绘制的文件夹。所以是的! – tobias

+0

保留一个HashMap ,其中关键字是与您的表情符号 – Blackbelt

回答

1

试试这个:

EditText et = new EditText(this); 
et.setTextSize(24); 
et.setHint("this view shows \":)\" as an emoticon, try to type \":)\" somewhere"); 
final Bitmap smile = BitmapFactory.decodeResource(getResources(), R.drawable.emo_im_happy); 
final Pattern pattern = Pattern.compile(":\\)"); 
TextWatcher watcher = new TextWatcher() { 
boolean fastReplace = true; 
    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
     //Log.d(TAG, "onTextChanged " + start + " " + before + " " + count); 
     if (fastReplace) { 
      if (start > 0 && count > 0) { 
       String sub = s.subSequence(start - 1, start + 1).toString(); 
       if (sub.equals(":)")) { 
        Spannable spannable = (Spannable) s; 
        ImageSpan smileSpan = new ImageSpan(smile); 
        spannable.setSpan(smileSpan, start-1, start+1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
       } 
      } 
     } else { 
      Spannable spannable = (Spannable) s; 
      Matcher matcher = pattern.matcher(s); 
      while (matcher.find()) { 
       int mstart = matcher.start(); 
       int mend = matcher.end(); 
       ImageSpan[] spans = spannable.getSpans(mstart, mend, ImageSpan.class); 
       Log.d(TAG, "onTextChanged " + mstart + " " + mend + " " + spans.length); 
       if (spans.length == 0) { 
        ImageSpan smileSpan = new ImageSpan(smile); 
        spannable.setSpan(smileSpan, mstart, mend, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
       } 
      } 
     } 
     Log.d(TAG, "onTextChanged " + s); 
    } 

    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
    } 

    @Override 
    public void afterTextChanged(Editable s) { 
     Log.d(TAG, "afterTextChanged " + s); 
    } 
}; 
et.addTextChangedListener(watcher); 

setContentView(et); 

这里如果fastReplace == true你不必扫描整个文本,但它只是最小的实现:只有当你键入的作品“)”右后键入“:”,如果fastReplace == false它用笑脸替换“:)”的每一个出现,但它必须扫描整个文本,所以当文本很大时它会慢一点