前言:最近在项目学习的过程中,发现SpannableStringBuilder类,并且该类能对TextView的内容进行自定义文字大小、颜色、加下划线等功能,因而特地对该类的相关知识进行研究
1. SpannableString、SpannableStringBuilder与String的关联
首先SpannableString与SpannableStringBuilder与String类似,也是用来存储字符串,但它俩的特殊就在于SetSpan()方法,能让存储在其中的String添加各种格式或者样式(Span),让原来的String以不同的样式显式出来,如在原String上加下划线、加背景、改变字体颜色等等。
2. SpannableString、SpannableStringBuilder区别
因为SpannableString和SpannableStringBuilder的区别与String和StringBuilder类似,因而下表将四个类放在一起进行对比
表一:四个CharSequence的子类对比
| 类 | String | StringBuilder | SpannableString | SpannableStringBuilder |
|---|---|---|---|---|
| 继承接口 | CharSequence | CharSequence | CharSequence | CharSequence |
| 是否可变 | 不可变 | 可变 | 不可变 | 可变 |
| 是否线程安全 | 是 | 否 | 是 | 否 |
拼接append() | 否 | 是 | 否 | 是 |
3. SetSpan()方法
void setSpan(Object what, int start, int end, int flags)
方法的作用:给SpannableString或SpannableStringBuilder特定范围的字符串设定Span式样,可以设置多个(比如同时加下划线和改变字体颜色等),Flags参数标识了当在所标记范围前和标记范围后紧贴着插入新字符时的动作,即是否对新插入的字符应用同样的样式。
setSpan()方法的参数 | Object what | int start | int end | int flags |
|---|---|---|---|---|
| 含义 | 对应的各种Span | 开始应用指定Span的位置,索引从0开始 | 结束应用指定Span的位置,特效不包括该位置 | 对标记范围前后插入的字体是否使用新式样 |
| 各参数的具体示例 | val span = new ForegroundColorSpan(Color.BLUE);字体颜色 | ———————— | ———————— | Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前后都不包括。即仅在指定范围的前后插入新字符都不会应用新样式 |
val span = new BackgroundColorSpan(Color.YELLOW);:字体背景颜色 | Spannable.SPAN_EXCLUSIVE_INCLUSIVE:前面不包括,后面包括。即仅在指定范围的后插入新字符时会应用新样式 | |||
span = new AbsoluteSizeSpan(16);:字体大小 | Spannable.SPAN_INCLUSIVE_EXCLUSIVE:前面包括,后面不包括。 | |||
span = new StyleSpan(Typeface.BOLD_ITALIC);:字体粗体、斜体 | Spannable.SPAN_INCLUSIVE_INCLUSIVE:前后面都包括 | |||
span = new StrikethroughSpan();:字体删除线 | ||||
span = new UnderlineSpan();:字体下划线 | ||||
span = new ImageSpan(Drawable对象, ImageSpan.ALIGN_BASELINE); :字体下划线 |