SpannableString
Android中在使用TextView的过程中,有时候会需要将一串文本中的部分文字做特别的显示效果处理,比如加粗、改变颜色、加着重标识、超链接等等,我们可以通过多个TextView拼凑来实现,但如果需要特殊处理的内容在整个文本的中间,用多个TextView拼凑实在是太麻烦、太Low了,Android提供的SpannableString类能够很好地解决这个问题,SpannableString结合下面各种以Span结尾的类可以做出丰富多样的显示效果。
SpannableString 和String 类似,也是用来存储字符串,但它们俩的特殊就在于有一个SetSpan()函数,能给这些存储的String添加各种格式或者称样式(Span),将原来的String以不同的样式显示出来,比如在原来String上加下划线、加背景色、改变字体颜色、用图片把指定的文字给替换掉,等等。所以,总而言之,SpannableString、SpannableStringBuilder与String一样, 首先也是传字符串,但SpannableString、SpannableStringBuilder可以对这些字符串添加额外的样式信息,但String则不行。
SpannableString与SpannableStringBuilder
同String和StringBuilder一样,只不过,SpannableString在构造时需要传入一个String对象,之后无法改变其中的内容,而SpannableStringBuilder同StringBuilder类似,可以通过append()拼接多个字符串。
//spannableString 需要将string传入
SpannableString spannableString = new SpannableString("我是spannableString");
//spannableStringBuilder 可以不传入,利用append添加
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder();
spannableStringBuilder.append("我");
spannableStringBuilder.append("是");
spannableStringBuilder.append("spannable");
spannableStringBuilder.append("StringBuilder");
因为Spannable等最终都实现了CharSequence接口,所以可以直接把SpannableString和SpannableStringBuilder通过TextView.setText()设置给TextView。
SetSpan()
void setSpan (Object what, int start, int end, int flags)
函数意义:给SpannableString或SpannableStringBuilder特定范围的字符串设定Span样式,可以设置多个(比如同时加上下划线和删除线等),Falg参数标识了当在所标记范围前和标记范围后紧贴着插入新字符时的动作,即是否对新插入的字符应用同样的样式。(这个后面会具体举例说明)
参数说明:
object what :对应的各种Span,后面会提到;
int start:开始应用指定Span的位置,索引从0开始
int end:结束应用指定Span的位置,特效并不包括这个位置。比如如果这里数为3(即第4个字符),第4个字符不会有任何特效。从下面的例子也可以看出来。
int flags:取值有如下四个
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前后都不包括,即在指定范围的前面和后面插入新字符都不会应用新样式
Spannable.SPAN_EXCLUSIVE_INCLUSIVE :前面不包括,后面包括。即仅在范围字符的后面插入新字符时会应用新样式
Spannable.SPAN_INCLUSIVE_EXCLUSIVE :前面包括,后面不包括。
Spannable.SPAN_INCLUSIVE_INCLUSIVE :前后都包括。
各种span设置
应用一个Span总共分三步:
1、构造String
2、构造Span
3、利用SetSpan()对指定范围的String应用这个Span
其中span分为:
1.字体颜色设置 ForegroundColorSpan
ForegroundColorSpan span = new ForegroundColorSpan(Color.BLUE);
2.字体背景颜色 BackgroundColorSpan
BackgroundColorSpan span = new BackgroundColorSpan(Color.YELLOW);
3.字体大小 AbsoluteSizeSpan
AbsoluteSizeSpan span = new AbsoluteSizeSpan(16);
4.粗体、斜体 StyleSpan
//粗体
StyleSpan span = new StyleSpan(Typeface.BOLD_ITALIC);
//斜体
StyleSpan span = new StyleSpan(Typeface.ITALIC);
5.删除线 StrikethroughSpan
StrikethroughSpan span = new StrikethroughSpan();
6.下划线 UnderlineSpan
UnderlineSpan span = new UnderlineSpan();
7.图片置换 ImageSpan
Drawable d = getResources().getDrawable(R.drawable.ic_launcher);
d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE);
这个函数的不同之处在于,前几都是在原来文字的基础上加上特效,而这里却是利用图片将文字替换。如果遇到不支持显示图片的函数,比如前一篇中的canvas绘图。就会退化成String,即以原来的String字符串来显示。