将drawable转换为特定字符串

时间:2013-06-01 20:17:27

标签: android emoticons

我有一个聊天应用程序,我想用表情符号扩展。

此代码用于在文本中插入笑脸:

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

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

这很有效。表情符号出现在textView的正确位置。

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

1 个答案:

答案 0 :(得分: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它取代每个带有笑脸的“:)”但是它必须扫描整个文本,所以当文字非常大时它会慢一点