一、前言:
我们在开发中,经常遇到一段文本,需要单独给它部分文字设置不同的样式,有的文字设置为粗体,有的文字设置特殊的颜色,有的地方要加入表情,遇到数学公式还可能要设置上下标,这时候该怎么办呢?
有的人会采用不同的 TextView,这样就可以完美解决了。先不说这个方法行不行得通,事实上,若采用这种方式,当碰上一段文字需要设置非常多的样式时,光是这一堆TextView就够浪费资源的了,布局还复杂,也不利于维护,因此这种方式一般不会被采用。
那么有其他办法吗?有,并且还很简单,今天介绍的这个SpannableString就是用来解决这个问题的。
xml 代码片段:
第一种方法:
第二种方法:
采用 SpannableString实现
1、SpannableString、SpannableStringBuilder与String的关系
首先SpannableString、SpannableStringBuilder基本上与String差不多,也是用来存储字符串,但它们俩的特殊就在于有一个SetSpan()函数,能给这些存储的String添加各种格式或者称样式(Span),将原来的String以不同的样式显示出来,比如在原来String上加下划线、加背景色、改变字体颜色、用图片把指定的文字给替换掉,等等。所以,总而言之,SpannableString、SpannableStringBuilder与String一样, 首先也是传字符串,但SpannableString、SpannableStringBuilder可以对这些字符串添加额外的样式信息,但String则不行。
注意:如果这些额外信息能被所用的方式支持,比如将SpannableString传给TextView;也有对这些额外信息不支持的,比如前一章讲到的Canvas绘制文字,对于不支持的情况,SpannableString和SpannableStringBuilder就是退化为String类型,直接显示原来的String字符串,而不会再显示这些附加的额外信息。
2、SpannableString与SpannableStringBuilder区别
这里讲解一下几个参数的意义:
- what:对SpannableString进行润色的各种Span;
- int:需要润色文字段开始的下标;
- end:需要润色文字段结束的下标;
- flags:决定开始和结束下标是否包含的标志位,有四个参数可选
- SPAN_INCLUSIVE_EXCLUSIVE:包括开始下标,但不包括结束下标
- SPAN_EXCLUSIVE_INCLUSIVE:不包括开始下标,但包括结束下标
- SPAN_INCLUSIVE_INCLUSIVE:既包括开始下标,又包括结束下标
- SPAN_EXCLUSIVE_EXCLUSIVE:不包括开始下标,也不包括结束下标
这里涉及到一个重要的角色,就是各种各样的span,它决定我们要对文字的进行怎样的润饰,而后三个参数决定润饰哪些文字,为了方便起见,后面的flags默认都使用SPAN_INCLUSIVE_EXCLUSIVE模式。
3、 ForegroundColorSpan
代码
- ForegroundColorSpan:前景色,也就是对文字上色,颜色设置为GREEN,start为4,end为7,应该是“陈奕迅”三个字显示为绿色。
- “如果” 也是绿色
注意:必须new两个ForegroundColorSpan,否则只有一个地方字体变绿;4、 BackgroudColorSpan
代码
BackgroudColorSpan:与ForegroundColorSpan类似,对文字背景上色
5、 AbsoluteSizeSpan
1、代码
AbsoluteSizeSpan:设置字体的绝对大小,40表示文字大小,true表示单位为dip,若为false则表示px。
2、代码
RelativeSizeSpan:设置文字的相对大小,相对于原先文字的0.7f的大小。
6、 UnderlineSpan (下划线)
代码
UnderlineSpan:设置文字下划线,强调突出文字时可以使用该span
7、StrikethroughSpan (中间删除线)
代码
8、 SuperscriptSpan (上标)
代码
SuperscriptSpan:设置文字为上标
9、部分文字的点击事件
- ForegroundColorSpan:前景色
- BackgroundColorSpan:背景色
- ClickableSpan:抽象类,可点击效果,重写onClick方法响应点击事件
- URLSpan:超链接
- MaskFilterSpan:EmbossMaskFilter浮雕效果,BlurMaskFilter模糊效果
- RelativeSpan:文字相对大小(采用0.5f,是原先的字体大小的1/2)
- AbsoluteSpan:文字绝对大小(设置字体的相绝对大小,40表示文字大小,true表示单位为dip,若为false则表示px)
- ScaleXSpan:x轴缩放
- styleSpan:文字样式
- TypefaceSpan:文字字体类型
- TextApearanceSpan:文字外貌
- UnderlineSpan:下划线
- StrikeThroughSpan:删除线
- SuperscriptSpan:上标
- SubscriptSpan:下标
- ImageSpan:图片