聊天表情越来越丰富了,整理一下表情图片与EditText的结合(TextView同理)
先上个图:

===========
1、通过ImageSpan将图片嵌入到文本中
Drawable drawable;//图片
...
//让表情符号跟文字的大小一致
drawable.setBounds(0, 0, editText.getLineHeight(), editText.getLineHeight());
ImageSpan imageSpan = new ImageSpan(drawable);//也可以用Bitmap创建
//{:1:}对应一个表情符号
SpannableString spannableString = new SpannableString("{:1:}haha");
//0,5是{:1:},在原来文本的位置
spannableString.setSpan(imageSpan, 0, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
editText.setText(spannableString);
2、利用反射去获取图片
//key是图片名字,在drawable中,app package getContext().getResources().getIdentifier(key, "drawable", getContext().getPackageName())
3、正则表达式来替换表情符号
private CharSequence replace(String text) {
SpannableString spannableString = new SpannableString(text);
int start = 0;
//{:n:} 1-2数字
Pattern pattern = Pattern patternPattern.compile("\\{:\\d{1,2}:\\}", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(text);
//遍历
while (matcher.find()) {
try{
//获取对应的表情字段{:n:}中的n
String faceText = matcher.group();
String key = faceText.substring(2, faceText.lastIndexOf(":"));
key = String.format("face_%03d", Integer.parseInt(key));
//利用反射获取图片
Drawable drawable = getContext().getResources().getDrawable( getContext().getResources().getIdentifier(key, "drawable", getContext().getPackageName()) );
drawable.setBounds(0, 0, getLineHeight(), getLineHeight());
ImageSpan imageSpan = new ImageSpan(drawable);
//防止找到重复的
int startIndex = text.indexOf(faceText, start);
int endIndex = startIndex + faceText.length();
if (startIndex >= 0)
spannableString.setSpan(imageSpan, startIndex, endIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
start = (endIndex - 1);
}catch(Exception e){
e.printStackTrace();
}
}
}
4、自定义EditText,让表情默默的显示
public class EmoticonsEditText extends EditText {
...
@Override
public void setText(CharSequence text, BufferType type) {
if (!TextUtils.isEmpty(text)) {
super.setText(replace(text.toString()), type);
} else {
super.setText(text, type);
}
}
private CharSequence replace(String text) {...}
}
5、示意图的表情面板
(稍后再写一篇
)