在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