當涉及聊天時,通常需要在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);
}
源碼就不發了,原理其實很簡單,大家就自己研究一下吧