Span

Android中,有时候需要对一串文本中部分文本进行各种特别的设置,比如颜色、大小、首行缩进,或者是在一段文本中加入图片, 甚至是书写一些特殊的公式。 如果通过布局文件使用多个控件来实现,那么布局会特别的复杂,增加了布局文件维护的难度,并且加入了太多的控件,在页面加载时也要耗费更多的资源。 用SpannableSpan来实现将非常容易。

HTML里有span元素。span元素用来展示文本的,而且是行内元素。

Android中的Span就是借鉴了HTML里有span元素的特性。用它来实现富文本特效。

1.1、Spannable

Spannable的类结构图:

可以看出,Spannable接口继承自Spanned接口,Spanned又继承自CharSequence接口。

TextViewsetText(CharSequence text)方法中,要求的参数正好是一个CharSequence的实例,CharSequence的子接口或者子类的实例都可以传入。

1.1.1、Spannable实例的构造

下面是构造Spannable的实例:

Spannable spannable = new SpannableString("字符串");
Spannable spannable = SpannableString.valueOf("字符串");

SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder("字符串");
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder("字符串",0, 3);
SpannableStringBuilder spannableStringBuilder = SpannableStringBuilder.valueOf("字符串");
1.1.2、spannable.setSpan(Object span, int start, int end, int flags)

在构建出了Spannable对象以后,就可以使用spannable.setSpan(Object span, int start, int end, int flags)方法来进行样式的设置了。

1.1.2.1、start

start则是该样式开始的位置。

1.1.2.2、end

end对应的是样式结束的位置。

1.1.2.3、flags

flags是定义在Spannable中的常量,常用的有:

  • Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
    (a,b),不包含两端start和end所在的端点
  • Spanned.SPAN_EXCLUSIVE_INCLUSIVE
    (a,b],不包含端start,但包含end所在的端点
  • Spanned.SPAN_INCLUSIVE_EXCLUSIVE
    [a,b),包含两端start,但不包含end所在的端点
  • Spanned.SPAN_INCLUSIVE_INCLUSIVE
    [a,b],包含两端start和end所在的端点
1.1.2.4、span

span是具体样式。

span的类结构图: