/*
* 匹配出字符串中的表情
* */
public static SpannableString getExpressionString(Context context, String str) {
SpannableString spannableString = new SpannableString(str);
// 正则表达式匹配字符串里是否含有表情,如: 我好[开心]啊
String zhengze = "\\[[^\\]]+\\]";
// 通过传入的正则表达式来生成一个pattern
Pattern sinaPatten = Pattern.compile(zhengze, Pattern.CASE_INSENSITIVE);
Matcher matcher = sinaPatten.matcher(spannableString);
while (matcher.find()) {
String key = matcher.group();
// 返回第一个字符的索引的文本匹配整个正则表达式,ture 则继续递归
if (matcher.start() < 0) {
continue;
}
int resId = EmojiUtils.getEmojiMapByNameKey().get(key) == null ? -1: EmojiUtils.getEmojiMapByNameKey().get(key);
if (resId == -1) {
continue;
}
Drawable drawable = context.getResources().getDrawable(resId);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());
ImageSpan imageSpan = new ImageSpan(drawable,ImageSpan.ALIGN_BOTTOM);
// 计算该图片名字的长度,也就是要替换的字符串的长度
int end = matcher.start() + key.length();
// 将该图片替换字符串中规定的位置中
spannableString.setSpan(imageSpan, matcher.start(), end,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
return spannableString;
}
/*
* 将表情插入EditText
* */
public static SpannableString getInsertSmailString(Context context,int[] img,int pos){
Drawable drawable = context.getResources().getDrawable(img[pos]);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
//需要处理的文本,[smile]是需要被替代的文本
ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BOTTOM);
SpannableString spannable = new SpannableString(EmojiUtils.getEmojiMapByIDKey().get(img[pos]));
//要让图片替代指定的文字就要用ImageSpan
//开始替换,注意第2和第3个参数表示从哪里开始替换到哪里替换结束(start和end)
//最后一个参数类似数学中的集合,[5,12)表示从5到12,包括5但不包括12
spannable.setSpan(span, 0 , EmojiUtils.getEmojiMapByIDKey().get(img[pos]).length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return spannable;
}
/*
* Spanned.SPAN_EXCLUSIVE_EXCLUSIVE,这是在 setSpan 时需要指定的 flag,它的意义我试了很久也没试出来,睡个觉,今天早上才突然有点想法,试之,果然。
* 它是用来标识在 Span 范围内的文本前后输入新的字符时是否把它们也应用这个效果。分别有 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE(前后都不包括)、
* Spanned.SPAN_INCLUSIVE_EXCLUSIVE(前面包括,后面不包括)、Spanned.SPAN_EXCLUSIVE_INCLUSIVE(前面不包括,后面包括)、
* Spanned.SPAN_INCLUSIVE_INCLUSIVE(前后都包括)。
* */
向EditText或TextView中添加笑脸
最新推荐文章于 2021-05-26 03:22:12 发布