可以高亮显示关键字并设置不同字体大小的自定义TextView

来源:互联网 发布:伯乐在线 人工智能 编辑:程序博客网 时间:2024/05/08 12:35

好久没有写文章了,最近有些时间,所以就写了这篇文章。在写业务的时候,经常会碰到一些这样的需求,一个TextView中需要你高亮显示部分重要的关键字,并且需要字体变的更大些,类似于下图。


像这种需求,如果不用一个TextView来实现,来就得多个TextView控件,这样对于性能是有些伤害的,所以才想去写一个满足这种需求的TextView控件。

写的这个自定义View是去继承了TextView。代码如下:

import android.content.Context;import android.text.Spannable;import android.text.SpannableStringBuilder;import android.text.style.AbsoluteSizeSpan;import android.text.style.ForegroundColorSpan;import android.util.AttributeSet;import android.widget.TextView;import java.util.ArrayList;import java.util.List;/** * Created by yuzhuo on 16/9/11. */public class SpannableTextView extends TextView {    private Context context;    public SpannableTextView(Context context, AttributeSet attrs) {        super(context, attrs);        this.context = context;    }    public void setSpecifiedTextsColor(String text, String specifiedTexts,                                       int color,int textSize) {        //color is the text need change the color        List<Integer> sTextsStartList = new ArrayList<Integer>();        specifiedTexts = specifiedTexts.toLowerCase();        int sTextLength = specifiedTexts.length();        String temp = text.toLowerCase();        int lengthFront = 0;// 记录被找出后前面的字段的长度        int start = -1;        do {            start = temp.indexOf(specifiedTexts);            if (start != -1) {                start = start + lengthFront;                sTextsStartList.add(start);                lengthFront = start + sTextLength;                temp = text.substring(lengthFront);            }        } while (start != -1);        SpannableStringBuilder styledText = new SpannableStringBuilder(text);        for (Integer i : sTextsStartList) {            styledText.setSpan(new ForegroundColorSpan(color), i, i                    + sTextLength, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);            if(textSize>0) {                styledText.setSpan(new AbsoluteSizeSpan(sp2px(context, textSize)), i, i                        + sTextLength, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);            }        }        setText(styledText);    }    /**     * 将sp值转换为px值,保证文字大小不变     *     * @param spValue     * @param context     *            (DisplayMetrics类中属性scaledDensity)     * @return     */    public int sp2px(Context context, float spValue) {        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;        return (int) (spValue * fontScale + 0.5f);    }}

这个类主要是用了android.text下面的两个类:Spannable和SpannableStringBuilder

import android.text.Spannable;import android.text.SpannableStringBuilder;

用这两个类来实现了,针对于不同的内容来进行设置不能的textStyle,这样便达到了这一效果。

给出实现效果图:



这个功能比较小,但是很实用,希望对大家有帮助。

1 0
原创粉丝点击