让TextView中的部分文字显示不同的状态

来源:互联网 发布:如何增加淘宝流量 编辑:程序博客网 时间:2024/05/22 00:21

最近和学长们一起做项目,我负责做评论那一块,在评论回复的时候,需要高亮出某一部分文字,于是有了这篇文章

想实现这样的功能,需要用到SpannableString和SpannableStringBuilder


一,概述

1,SpannableString和SpannableStringBuilder与String的关系

首先,SpannableString和SpannableStringBuilder基本上与String差不多,也是用来存储字符串,但是它俩特殊就在SetSpan()函数,能给这些存储的String添加各种格式或者称样式,将原来的String以不同的样式显示出来,比如在原来的String上加下划线,加背景色,改变字体颜色,用图片把指定的文字给替换掉,等等。

注意:如果这些额外信息能被所用的方式支持,比如将SpannableString传给TextView,额外信息会正确显示。如果对这些额外信息不支持的,比如用Canvas绘制文字,对于不支持的情况,SpannableString和SpannableStringBuilder就会退化为String类型,不会显示这些附加的额外信息

2,SpannableString和SpannableStringBuilder区别

它们的区别在于SpannableString像一个String一样,构造对象的时候传入一个String,之后再无法更改String的内容,也无法拼接多个SpannableString,而SpannableStringBuilder则更像是StringBuilder,它可以通过其append()犯法来拼接多个String:

//使用SpannableString,必须一次传入,构造完成  SpannableString word = new SpannableString("欢迎光临Harvic的博客");  //使用SpannableStringBuilder,可以使用append()再添加  SpannableStringBuilder multiWord = new SpannableStringBuilder();  multiWord.append("欢迎光临");  multiWord.append("Harvic的");  multiWord.append("博客");  

这里写图片描述

因为Spannable等最终都实现了CharSequence接口,所以可以直接把SpannableString和SpannableStringBuilder通过TextView.setText()设置给TextView

SetSpan()

void setSpan (Object what, int start, int end, int flags)

函数意义:给SpannableString或SpannableStringBuilder特别范围的字符串设定Span样式,可以设置多个(比如同时加上下划线和删除等),Flag参数标识了当时所在范围和标记范围后紧贴着插入新字符时的动作,即是否对新插入的字符应用同样的样式

参数说明:
object what:对应的各种Span
int start:开始应用指定span的位置,索引从0开始
int end:结束应用指定span的位置,特效并不包括这个位置。比如如果这里输为3(即第四个字符),第四个不会有任何特效

int flags:
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前后都不包括,即在指定范围的前面和后面插入新字符都不会应用新样式
Spannable.SPAN_EXCLUSIVE_INCLUSIVE :前面不包括,后面包括。即仅在范围字符的后面插入新字符时会应用新样式
Spannable.SPAN_INCLUSIVE_EXCLUSIVE :前面包括,后面不包括。
Spannable.SPAN_INCLUSIVE_INCLUSIVE :前后都包括。

  SpannableStringBuilder string = new SpannableStringBuilder("欢迎来到虾米音乐世界");        ForegroundColorSpan span = new ForegroundColorSpan(Color.RED);        string.setSpan(span,4,8, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);         textView.setText(string);

这里写图片描述

然后在span范围前后插入字符

  SpannableStringBuilder string = new SpannableStringBuilder("欢迎来到虾米音乐世界");        ForegroundColorSpan span = new ForegroundColorSpan(Color.RED);        string.setSpan(span,4,8, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);        string.insert(4,"happy");        string.insert(13,"happy");        textView.setText(string);

这里写图片描述

这样就可以看到flag的作用了


二,各种Span设置

在前面的一个小例子中,我们可以看到,要应用一个Span总共分三步:
1,构造String
2,构造Span
3,利用SetSpan()对指定范围的String应用这个Span

1,字体颜色设置(ForegroundColorSpan)

SpannableString spanString = new SpannableString("欢迎光临Harvic的博客");    //再构造一个改变字体颜色的Span  ForegroundColorSpan span = new ForegroundColorSpan(Color.BLUE);    //将这个Span应用于指定范围的字体  spanString.setSpan(span, 1, 5, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);    //设置给EditText显示出来  editText.setText(spanString);  

2,字体背景颜色(BackgroundColorSpan)

 BackgroundColorSpan span = new BackgroundColorSpan(Color.YELLOW);        string.setSpan(span,4,8, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);        textView.setText(string);

这里写图片描述

3,字体大小(AbsoluteSizeSpan)

 AbsoluteSizeSpan span = new AbsoluteSizeSpan(24);        string.setSpan(span,4,8, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);        textView.setText(string);

这里写图片描述

4,粗体,斜体(StyleSpan)

  StyleSpan span = new StyleSpan(Typeface.BOLD);        string.setSpan(span,4,8, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);        textView.setText(string);

这里写图片描述

5,删除线(StrikethroughSpan)

 StrikethroughSpan span = new StrikethroughSpan();        string.setSpan(span,4,8, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);        textView.setText(string);

这里写图片描述

6,下划线(UnderlineSpan)

  UnderlineSpan span = new UnderlineSpan();        string.setSpan(span,4,8, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);        textView.setText(string);

这里写图片描述

7,图片置换(ImageSpan)

Drawable d = getResources().getDrawable(R.mipmap.ic_launcher_round);        d.setBounds(0,0,d.getIntrinsicWidth(),d.getIntrinsicHeight());        ImageSpan span = new ImageSpan(d,ImageSpan.ALIGN_BASELINE);        string.setSpan(span,4,8, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);        textView.setText(string);

这里写图片描述


如果我们要为一段话设置多个span,可以这样:

   SpannableStringBuilder string = new SpannableStringBuilder("欢迎来到");       ForegroundColorSpan span = new ForegroundColorSpan(Color.RED);       string.setSpan(span,0,4,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);       string.append("虾米音乐");       string.setSpan(new ForegroundColorSpan(Color.BLUE),4,8,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);       string.append("世界");       string.setSpan(new ForegroundColorSpan(Color.parseColor("#b0b0b0")),8,10,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);        textView.setText(string);

这里写图片描述
或者这样:

 SpannableString string = new SpannableString("欢迎来到虾米音乐世界");        ForegroundColorSpan span = new ForegroundColorSpan(Color.RED);        string.setSpan(span,0,4,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);        span = new ForegroundColorSpan(Color.BLUE);        string.setSpan(span,4,8,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);        textView.setText(string);

某一部分设置多个样式:

SpannableString string = new SpannableString("欢迎来到虾米音乐世界");        ForegroundColorSpan span = new ForegroundColorSpan(Color.RED);        string.setSpan(span,0,4,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);        UnderlineSpan underlineSpan = new UnderlineSpan();        string.setSpan(underlineSpan,0,4,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);        textView.setText(string);

这里写图片描述


更多样式:
1、BackgroundColorSpan 背景色
2、ClickableSpan 文本可点击,有点击事件
3、ForegroundColorSpan 文本颜色(前景色)
4、MaskFilterSpan 修饰效果,如模糊(BlurMaskFilter)、浮雕(EmbossMaskFilter)
5、MetricAffectingSpan 父类,一般不用
6、RasterizerSpan 光栅效果
7、StrikethroughSpan 删除线(中划线)
8、SuggestionSpan 相当于占位符
9、UnderlineSpan 下划线
10、AbsoluteSizeSpan 绝对大小(文本字体)
11、DynamicDrawableSpan 设置图片,基于文本基线或底部对齐。
12、ImageSpan 图片
13、RelativeSizeSpan 相对大小(文本字体)
14、ReplacementSpan 父类,一般不用
15、ScaleXSpan 基于x轴缩放
16、StyleSpan 字体样式:粗体、斜体等
17、SubscriptSpan 下标(数学公式会用到)
18、SuperscriptSpan 上标(数学公式会用到)
19、TextAppearanceSpan 文本外貌(包括字体、大小、样式和颜色)
20、TypefaceSpan 文本字体
21、URLSpan 文本超链接

参考自:http://blog.csdn.net/lan410812571/article/details/9083023

原创粉丝点击