转载请注明本文出自woochen123的博客(http://blog.csdn.net/chewu1590/article/details/53141167),请尊重他人的辛勤劳动成果,谢谢!
当涉及聊天时,通常需要在EditText和TextView上显示表情,在这里提供一种思路,希望对大家有所帮助。
首先上效果图:
核心代码:
将输入框上的字符串替换成表情包中的内容
/**
* 将表情包使用SpannableStringBuilder包装,并显示到EditText中
* @param enojiName 表情的名字([name]---将字符串中的图片名字做过处理->[图片名字]->为了不产生奇怪的转义)
* @param j 在gridView中的索引值(emojiList中存储表情图片的id值)
*/
private void putEmojiToEditText(String enojiName, int j) {
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(enojiName);
//获取表情的drawable
Drawable drawable = mContext.getResources().getDrawable(emojiList.get(j));
int size = (int) (35 * mContext.getResources().getDisplayMetrics().density);
drawable.setBounds(0, 0, size, size);
//将图片使用ImageSpan包装起来
ImageSpan imageSpan = new ImageSpan(drawable);
spannableStringBuilder.setSpan(imageSpan, 0, enojiName.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
Editable editable = mMessageEditText.getText();
int selectionEnd = mMessageEditText.getSelectionEnd();
if (selectionEnd < editable.length()) {
editable.insert(selectionEnd, spannableStringBuilder);
} else {
editable.append(spannableStringBuilder);
}
}
将TextView上的字符串替换成图片:
/**
* 将消息进行解析显示到TextView中
* @param s 消息的内容(有editText.getText().toString()得到)
* @param mMessageTextView 用于显示解析后消息的控件
*/
private void parseMessage(String s, TextView mMessageTextView) {
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(s);
Pattern pattern = Pattern.compile("\\[(\\S+?)\\]");//匹配[xx]的字符串
Matcher matcher = pattern.matcher(s);
while (matcher.find()) {
int start = matcher.start();
int end = matcher.end();
String group = matcher.group();
group = group.substring(1, group.length() - 1);
Log.e("399", group);
int drawableId = getResources().getIdentifier(group, "drawable", getPackageName());
Drawable drawable = getResources().getDrawable(drawableId);
int size = (int) (35 * getResources().getDisplayMetrics().density);
drawable.setBounds(0, 0, size, size);
ImageSpan imageSpan = new ImageSpan(drawable);
spannableStringBuilder.setSpan(imageSpan, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
mMessageTextView.setText(spannableStringBuilder, TextView.BufferType.SPANNABLE);
}
源码就不发了,原理其实很简单,大家就自己研究一下吧