一、Spannable简介
首先,从官方文档可以看出Spannable
是一个接口,它本身实现了Spanned
接口,派生了三个子类分类Editable
, SpannableString
, SpannableStringBuilder
。Spannable
是设置文字样式的基础类,它引出的相关类主要是使文字实现不同的样式效果。
这是Spannable
在文字相关类中的关系图,Spanned
、String
和StringBuilder
并列为三大字符串类。如果说String为普通字符串,StringBuilder是高级动态字符串,那么Spanned就是附带样式的高级字符串了,而所谓Spannable,就是描述这个字符串的样式部分。
1.Spannable基本使用方法
String string = "0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz";
SpannableString spannableString = new SpannableString(string);
spannableString.setSpan(new WhatSpan(), startIndex, endIndex, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);
2.各种Span样式
各种Span类为我们带来了各种各样的样式,这些span分为两类:
- 一类是
CharacterStyle
,也就是说是针对单个字符可以设置的样式 - 另一类是
ParagraphStyle
,是针对段落进行的操作,ParagraphStyle
的span运行的时候会检测目标段落前后是否有\n,如果没有的话会抛出错误"PARAGRAPH span must start at paragraph boundary"
,这是一个大坑请务必要注意。
BulletSpan
BulletSpan 影响段落层次的文本格式。它可以给段落的开始处加上项目符号。
/**
* gapWidth: 项目符号和文本之间的间隙
* color: 项目符号的颜色,默认为透明
*/
BulletSpan span = new BulletSpan(36, Color.BLUE);
QuoteSpan
QuoteSpan 影响段落层次的文本格式。它可以给一个段落加上垂直的引用线。
/**
* color: 垂直的引用线颜色,默认是蓝色
*/
span = new QuoteSpan(Color.RED);
AlignmentSpan.Standard
AlignmentSpan.Standard 影响段落层次的文本格式。它可以把段落的每一行文本按正常、居中、相反的方式对齐。
/**
* align: 对齐方式 有三种:
* Layout.Alignment.ALIGN_OPPOSITE
* Layout.Alignment.ALIGN_NORMAL
* Layout.Alignment.ALIGN_CENTER
*/
span = new AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER);
UnderlineSpan
UnderlineSpan 影响字符级的文本格式。它可以为字符集加上下划线,归功于 Paint的setUnderlineText(true))方法。
//下划线
span = new UnderlineSpan();
StrikethroughSpan
StrikethroughSpan 影响字符级的文本格式。它可以给字符集加上删除线,归功于 Paint的setStrikeThruText(true))方法。
//删除线
span = new StrikethroughSpan();
SubscriptSpan
SubscriptSpan 影响字符级的文本格式,它可以通过减小 TextPaint#baselineShift 给字符集加下标。
//下标
span = new SubscriptSpan();
SuperscriptSpan
SuperscriptSpan 影响字符级的文本格式。它可以通过增加 TextPaint#baselineShift 给字符集加上标。
//上标
span = new SuperscriptSpan();
BackgroundColorSpan
BackgroundColorSpan 影响字符级的文本格式。它可以给字符集加上背景颜色。
//设置字符背景颜色
span = new BackgroundColorSpan(Color.GREEN);
ForegroundColorSpan
ForegroundColorSpan 影响字符级的文本格式,它可以设置字符集的前景颜色也即文字颜色。
//设置蓝色的前景
span = new ForegroundColorSpan(Color.BLUE);
ImageSpan
ImageSpan 影响字符级的文本格式。它可以生成图像字符。这是为数不多的文档齐全的 Span
/**
* Context: 上下文
* resourceId: 图像资源id
*/
span = new ImageSpan(this, R.drawable.ic_small);
StyleSpan
StyleSpan 影响字符级的文本格式,它可以给字符集设置样式(blod、italic、normal)。
//设置bold+italic的字符样式
span = new StyleSpan(Typeface.BOLD | Typeface.ITALIC);
TypefaceSpan
TypefaceSpan 影响字符级的文本格式。它可以给字符设置字体集(monospace、serif等)。
//设置serif family
span = new TypefaceSpan("serif");
TextAppearanceSpan
TextAppearanceSpan 影响字符级的文本格式。它可以给字符集设置外观(appearance)。
/**
* context: 上下文
* appearance:appearance资源id(例如:android.R.style.TextAppearance_Small)
* colorList:文本的颜色资源id(例如:android.R.styleable.Theme_textColorPrimary)
*/
TextAppearanceSpan(Context context, int appearance, int colorList)
/**
* family:字体family
* style:描述样式(例如:android.graphics.Typeface)
* size:文字大小
* color:文字颜色
* linkColor:连接文本的颜色
*/
TextAppearanceSpan(String family, int style, int size, ColorStateList color, ColorStateList linkColor)
<-- style.xml -->
<style name="SpecialTextAppearance" parent="@android:style/TextAppearance">
<item name="android:textColor">@color/color1</item>
<item name="android:textColorHighlight">@color/color2</item>
<item name="android:textColorHint">@color/color3</item>
<item name="android:textColorLink">@color/color4</item>
<item name="android:textSize">28sp</item>
<item name="android:textStyle">italic</item>
</style>