Android 关键字高亮

这是我参与11月更文挑战的第27天,活动详情查看:2021最后一次更文挑战

前言

项目中经常会遇到需要对关键字加特殊色值显示,不管是搜索内容还是列表关键字展示,对于特殊文字或者词组高亮是一种很常见的需求,Android 没有自带这样的工具或者组件提供,但是我们可以自己实现一个这样的工具类,用到的地方直接调用就好了。

文字高亮

所谓文字高亮,其实就是针对某个字符做特殊颜色显示,下面列举几种常见的实现方式

一、通过加载Html标签,显示高亮

Android 的TextView 可以加载带Html标签的段落,方法:

textView.setText(Html.fromHtml("<font color='red' size='24'>Hello World</font>"));

复制代码

那么要高亮显示关键字,就可以这样实现,把需要高亮显示的关键字,通过这样的方式,组合起来就好了,例如:

textView.setText(“这是我的第一个安卓项目” + Html.fromHtml("<font color='red' size='24'>Hello World</font>"));

复制代码

二、通过SpannableString来实现文本高亮

先来简单了解下SpannableString

SpannableString的基本使用代码示例:

//设置Url地址连接
private void addUrlSpan() {  
    SpannableString spanString = new SpannableString("超链接");  
    URLSpan span = new URLSpan("tel:0123456789");  
    spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
    tv.append(spanString);  
}  

 //设置字体背景的颜色
private void addBackColorSpan() {  
    SpannableString spanString = new SpannableString("文字背景颜色");  
    BackgroundColorSpan span = new BackgroundColorSpan(Color.YELLOW);  
    spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
    tv.append(spanString);  
}  
 //设置字体的颜色
private void addForeColorSpan() {  
    SpannableString spanString = new SpannableString("文字前景颜色");  
    ForegroundColorSpan span = new ForegroundColorSpan(Color.BLUE);  
    spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
    tv.append(spanString);  
} 
//设置字体的大小
private void addFontSpan() {  
    SpannableString spanString = new SpannableString("36号字体");  
    AbsoluteSizeSpan span = new AbsoluteSizeSpan(36);  
    spanString.setSpan(span, 0, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
    tv.append(spanString);  
}  

复制代码

以上是比较常用的,还有其他例如设置字体加粗,下划线,删除线等,都可以实现

我们这里主要用到给字体设置背景色,通过正则表达式匹配关键字,设置段落中匹配到的关键字高亮

/***
 * 指定关键字高亮 字符串整体高亮
 * @param originString    原字符串
 * @param keyWords        高亮字符串
 * @param highLightColor  高亮色值
 * @return 高亮后的字符串
 */
public static SpannableString getHighLightWord(String originString, String keyWords, int highLightColor) {
    SpannableString originSpannableString = new SpannableString(originString);
    if (!TextUtils.isEmpty(keyWords)) {
        Pattern pattern = Pattern.compile(keyWords);
        Matcher matcher = pattern.matcher(originSpannableString);
        while (matcher.find()) {
            int startIndex = matcher.start();
            int endIndex = matcher.end();
            originSpannableString.setSpan(new ForegroundColorSpan(highLightColor), startIndex, endIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
    }
    return originSpannableString;
}
复制代码

在扩展一下,可以支持关键字,关键词拆分显示

类似:测试1234测1234试(测试为高亮字,实现测试/测/试分别高亮)

/***
 * 指定关键字高亮 支持分段高亮
 * @param originString
 * @param keyWords
 * @param highLightColor
 * @return
 */
public static SpannableString getHighLightWords(String originString, String keyWords, int highLightColor) {
    SpannableString originSpannableString = new SpannableString(originString);
    if (!TextUtils.isEmpty(keyWords)) {
        for (int i = 0; i < keyWords.length(); i++) {
            Pattern p = Pattern.compile(String.valueOf(keyWords.charAt(i)));
            Matcher m = p.matcher(originSpannableString);
            while (m.find()) {
                int start = m.start();
                int end = m.end();
                originSpannableString.setSpan(new ForegroundColorSpan(highLightColor), start, end,
                        Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
        }
    }
    return originSpannableString;
}
复制代码

字符可以,那么数组呢,是不是也可以实现了?

/***
 * 指定关键字数组高亮
 * @param originString 原字符串
 * @param keyWords   高亮字符串数组
 * @param highLightColor 高亮色值
 * @return 高亮后的字符串
 */
public static SpannableString getHighLightWordsArray(String originString, String[] keyWords, int highLightColor) {
    SpannableString originSpannableString = new SpannableString(originString);
    if (keyWords != null && keyWords.length > 0) {
        for (int i = 0; i < keyWords.length; i++) {
            Pattern p = Pattern.compile(keyWords[i]);
            Matcher m = p.matcher(originSpannableString);
            while (m.find()) {
                int start = m.start();
                int end = m.end();
                originSpannableString.setSpan(new ForegroundColorSpan(highLightColor), start, end,
                        Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
        }
    }
    return originSpannableString;
}
复制代码

总结

这样不管来什么需求,是不是都可以满足了,随便产品经理提,要什么给什么

猜你喜欢

转载自juejin.im/post/7035977902344650782