概述
我们在做项目的过程中经常需要关键字高亮来提醒用户。 就比如我们在ide中一些系统级的关键字会以不同的颜色来展示一样。
最近我看设计图中有一个很眼熟的效果,由于之前写过但是没有留下任何痕迹,所以这次又写了一个工具类。记录一下,方便以后的使用。
/**
*
* @param text 文字的总内容
* @param indexStr 关键字的内容
* @param color 关键字的颜色
* @return
*/
public SpannableStringBuilder setColor(String text, String indexStr, int color) {
// 记录关键字的次数 与他在整个字符中所占的索引位置
String[] deStr = text.split(indexStr);
ArrayList<Entity> objects = new ArrayList<>(deStr.length);
int cycleSize = text.endsWith(indexStr) ? deStr.length : deStr.length - 1;
for (int i = 0; i < cycleSize; i++) {
Entity entity = new Entity();
int index;
if (i == 0) {
index = text.indexOf(indexStr);
} else {
Entity entity1 = objects.get(i - 1);
index = text.indexOf(indexStr, entity1.end);
}
entity.start = index;
entity.end = index + indexStr.length();
objects.add(entity);
}
//根据索引集合 来设置关键字 字体颜色
SpannableStringBuilder builder = new SpannableStringBuilder(text);
for (int i = 0; i < objects.size(); i++) {
//这个实例设置一次关键字的时候就要重新实例一次
ForegroundColorSpan redSpan = new ForegroundColorSpan(color);
builder.setSpan(redSpan, objects.get(i).start, objects.get(i).end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
return builder;
}
private static volatile TextSpanUtil mTextSpanUtil;
public static TextSpanUtil getInstant() {
if (null == mTextSpanUtil) {
synchronized (TextSpanUtil.class) {
if (null == mTextSpanUtil) {
mTextSpanUtil = new TextSpanUtil();
}
}
}
return mTextSpanUtil;
}
public class Entity {
public int start;
public int end;
@Override
public String toString() {
return "Entity{" +
"start=" + start +
", end=" + end +
'}';
}
}
这里需要注意的是。因为我们用的是split 分隔符,所以如果关键字在整个字段末尾的话是不会多出一个字段的。 但如果是在首位就不会出现问题。
举个栗子: 如果内容为
“关键字abc关键字edfg关键字hi关键字j”
那么分割的内容为
[, abc, edfg, hi, j]
如果关键字在末尾
“abc关键字edfg关键字hi关键字”
那么结果为:
[abc, edfg, hi, j]
这个问题在以上的方法体中已经做过处理了 。