private static void dealPattern(int color, SpannableString spannableString, Pattern patten, int start) throws Exception {
Matcher matcher = patten.matcher(spannableString);
while (matcher.find()) {
String key = matcher.group();
// 返回第一个字符的索引的文本匹配整个正则表达式,ture 则继续递归
if (matcher.start() < start) {
continue;
}
// 计算该内容的长度,也就是要替换的字符串的长度
int end = matcher.start() + key.length();
//设置前景色span
spannableString.setSpan(new ForegroundColorSpan(color), matcher.start(), end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
if (end < spannableString.length()) {
// 如果整个字符串还未验证完,则继续。。
dealPattern(color, spannableString, patten, end);
}
break;
}
}
public interface SpanClickListener<T>{
void onSpanClick(T t);
}
private static void dealClick(SpannableString spannableString, Pattern patten, int start, final SpanClickListener spanClickListener, final Object bean){
Matcher matcher = patten.matcher(spannableString);
while (matcher.find()) {
String key = matcher.group();
// 返回第一个字符的索引的文本匹配整个正则表达式,ture 则继续递归
if (matcher.start() < start) {
continue;
}
// 计算该内容的长度,也就是要替换的字符串的长度
int end = matcher.start() + key.length();
spannableString.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
spanClickListener.onSpanClick(bean);
}
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
//设置画笔属性
ds.setUnderlineText(false);//默认有下划线
}
}, matcher.start(), end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
if (end < spannableString.length()) {
// 如果整个字符串还未验证完,则继续。。
dealClick(spannableString, patten, end, spanClickListener, bean);
}
break;
}
}
private void dealExpression(Context context,
SpannableString spannableString, Pattern patten, int start)
throws Exception {
Matcher matcher = patten.matcher(spannableString);
while (matcher.find()) {
String key = matcher.group();
if (matcher.start() < start) {
continue;
}
String value = emojiMap.get(key);
if (TextUtils.isEmpty(value)) {
continue;
}
// 通过上面匹配得到的字符串来生成图片资源id
int resId = context.getResources().getIdentifier(value, "drawable",
context.getPackageName());
if (resId != 0) {
Drawable emoji = context.getResources().getDrawable(resId);
int w = (int) (emoji.getIntrinsicWidth() * 0.40);
int h = (int) (emoji.getIntrinsicHeight() * 0.40);
emoji.setBounds(0, 0, w, h);
// 通过图片资源id来得到bitmap,用一个ImageSpan来包装
ImageSpan imageSpan = new ImageSpan(emoji);
// 计算该图片名字的长度,也就是要替换的字符串的长度
int end = matcher.start() + key.length();
// 将该图片替换字符串中规定的位置中
spannableString.setSpan(imageSpan, matcher.start(), end,
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
if (end < spannableString.length()) {
dealExpression(context, spannableString, patten, end);
}
break;
}
}
}
public static SpannableString getKeyWordSpan(int color, String str, String patterStr) throws Exception {
SpannableString spannableString = new SpannableString(str);
Pattern patten = Pattern.compile(patterStr, Pattern.CASE_INSENSITIVE);
dealPattern(color, spannableString, patten, 0);
return spannableString;
}
public static SpannableString getTopicSpan(int color, String str, boolean clickable,SpanClickListener spanClickListener, Topic topic) throws Exception {
SpannableString spannableString = new SpannableString(str);
Pattern patten = Pattern.compile(PatternString.TOPIC_PATTERN, Pattern.CASE_INSENSITIVE);
if(clickable){
dealClick(spannableString, patten, 0, spanClickListener, topic);
}
dealPattern(color, spannableString, patten, 0);
return spannableString;
}
public static SpannableString getAtUserSpan(int color, String str, boolean clickable, SpanClickListener spanClickListener, List<User> atUsers) throws Exception {
SpannableString spannableString = new SpannableString(str);
Pattern patten;
for (User u : atUsers) {
patten = Pattern.compile("@" + u.getName(), Pattern.CASE_INSENSITIVE);
if(clickable){
dealClick(spannableString, patten, 0, spanClickListener, u);
}
dealPattern(color, spannableString, patten, 0);
}
return spannableString;
}
public static SpannableString getExpressionSpan(Context context, String str) throws Exception {
return ExpressionConvertUtil.getInstace().getExpressionString(context, str);
}
private void testColoredKeywd() {
String string = "Android一词的本义指“机器人”,同时也是Google于2007年11月5日,Android logo相关图片,Android logo相关图片(36张)\n";
SpannableString cardText = null;
try {
cardText = SpanUtils.getKeyWordSpan(getResources().getColor(R.color.md_green_600), string, "Android");
} catch (Exception e) {
e.printStackTrace();
}
tvColoredKeywd.setText(cardText);
}
private void testTopic() {
String topic = "#舌尖上的大连#四种金牌烤芝士吃法爱吃芝士的盆友不要错过了~L秒拍视频\n";
SpannableString topicText = null;
try {
topicText = SpanUtils.getTopicSpan(Color.BLUE, topic, true, new SpanUtils.SpanClickListener<Topic>() {
@Override
public void onSpanClick(Topic t) {
Toast.makeText(MainActivity.this, "点击话题:" + t.toString() , Toast.LENGTH_SHORT).show();
}
}, new Topic(1, "舌尖上的大连"));
} catch (Exception e) {
e.printStackTrace();
}
tvTopic.setText(topicText);
//如果想实现点击,必须要设置这个
tvTopic.setMovementMethod(LinkMovementMethod.getInstance());
}
private void textAtUsers(){
List<User> users = new ArrayList<>();
users.add(new User(1, "好友1"));
users.add(new User(2, "好友2"));
StringBuilder sb = new StringBuilder("快来看看啊");
for (User u : users) {
sb.append("@").append(u.getName());
}
sb.append("\n");
try {
SpannableString atSpan = SpanUtils.getAtUserSpan(Color.BLUE, sb.toString(), true, new SpanUtils.SpanClickListener<User>() {
@Override
public void onSpanClick(User user) {
Toast.makeText(MainActivity.this, "@好友:" + user.toString(), Toast.LENGTH_SHORT).show();
}
}, users);
tvTestAt.setText(atSpan);
tvTestAt.setMovementMethod(LinkMovementMethod.getInstance());
} catch (Exception e) {
e.printStackTrace();
}
}
private void textExpression(){
String exStr = "今天天气很好啊[呲牙],是不是应该做点什么[色]";
SpannableString span = null;
try {
span = SpanUtils.getExpressionSpan(this, exStr);
} catch (Exception e) {
e.printStackTrace();
}
tvExpression.setText(span);
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有