在android中,如果要实现text的各种样式,图文混排等,简单的样式可以靠几个不同的textview来拼成,而复杂的样式要求,用不同的textview来拼接则不太现 实。这时候就spannable就起作用了,通过设置SpannableString或SpannableStringBuilder的setSpan来设置文本某段的样式,或者改变某段文本的颜色,或者大小,或者直接替换文本成图片。
android自带的样式在:android.text.style包里边
1.SpannableString与SpannableStringBuilder的区别
类似String 与StringBuilder的区别,一个是“一次性”的,一个是可以反复修改的。
SpannableString设置完后,不可更改;而SpannableStringBuilder则可以在原来基础上添加,替换,删除文本,甚至移出某个Span。
如果你需要经常改变文字及相关样式,最好使用SpannableStringBuilder。
2.setSpan(Object what, int start, int end, int flags)方法解析
what:这里传入样式,如:AbsoluteSizeSpan等
start:样式作用在文本的起始点(产生的作用包括该点,从0开始)
end:样式作用在文本的结束点(产生的作用不包括该点,从0开始)
flags:设置style是否包含start或者end
flags的选项在Spanned接口中,分别为:
SPAN_INCLUSIVE_EXCLUSIVE:包含start,不包含end
SPAN_INCLUSIVE_INCLUSIVE:start,end都包含
SPAN_EXCLUSIVE_EXCLUSIVE:start,end都不包含
SPAN_EXCLUSIVE_INCLUSIVE:start不包含,end包含
这里flags的作用,在SpannableString里基本没用,但是如果用在SpannableStringBuilder中,则会起作用,比如:
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder("猜不透是哪里出了错");
//这里设置设置后,显示到界面,则会看到“不透”2个字是放大的
spannableStringBuilder.setSpan(new AbsoluteSizeSpan(30, true), 1, 3, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
//关键是这里,SPAN_INCLUSIVE_EXCLUSIVE的作用则就会出来了
//如果这样:
spannableStringBuilder.insert(1,"a");
//则会有“a不透”是放大的,而如果设置的是SPAN_EXCLUSIVE_EXCLUSIVE,则"a"还是正常大小
//而如果设置SPAN_INCLUSIVE_INCLUSIVE
spannableStringBuilder.insert(3,"a");
//则会出现“不透a”为放大的,如果设置SPAN_INCLUSIVE_EXCLUSIVE,则“a”是正常大小
3.总结
INCLUSIVE或EXCLUSIVE会影响原来的span是否影响start点或end点的新字符,而如果在start,end点之间,则肯定会受影响。而新字符插入后,则start,end点 还会改变,比如从“不透”变为“不透a”放大,再在“不透a”后边插入字符,则会以“a”作为end点,根据flag来影响“a”后边插入的字符,而不是从“透”字算end