SpannableString、SpannableStringBuilder、Html字符串

前言

如下圖,在同一個TextView中顯示不同的顏色、大小,有兩種方法:設置Span和html字符串
圖片01

更新

不推薦在代碼中使用這種方法來控制顯示效果,非常不利於擴展,程序設計的思路應該是界面、邏輯分離。第一次在寫layout文件的時候稍微麻煩一點,以後修改、擴展的時候方便得多,java代碼簡潔、邏輯清晰。


SpannableString、SpannableStringBuilder類概述

SpannableString、SpannableStringBuilder和String都實現了CharSequence接口,都是字符串的載體。不同的是,SpannableString、SpannableStringBuilder還實現了Spannable接口,這個接口中有個setSpan()方法,用來設置字符串的風格(大小、顏色、背景等等),這就是本文要講的重點。

SpannableStringBuilder比SpannableString多實現了Appendable、Editable等接口,功能更多一些,類似於StringBuilder和String的區別。


setSpan(Object what, int start, int end, int flags)方法

參數1:各種類型的Span,比如控制字體大小的Span、控制字體顏色的Span等等;
參數2:開始應用Span的位置,索引從0開始;
參數3:結束應用Span的位置,並不包括這個位置。比如end爲3(即第4個字符),第4個字符不會有效果;
參數4:效果影響的模式,有下面4種;

Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前後都不包括,即在指定範圍的前面和後面插入新字符都不會應用新樣式
Spannable.SPAN_EXCLUSIVE_INCLUSIVE :前面不包括,後面包括。即僅在範圍字符的後面插入新字符時會應用新樣式
Spannable.SPAN_INCLUSIVE_EXCLUSIVE :前面包括,後面不包括。
Spannable.SPAN_INCLUSIVE_INCLUSIVE :前後都包括。

tips1:setSpan()方法會將設置的Span存入一個數組中,所以各種效果是可以疊加的;
tips2:通過setSpan()方法設置的Span,主要是用於在控件中顯示,只有控件才能讀取到其中的Span信息,在其它地方,無法讀取到其中的Span信息,只能讀取到String信息,比如Canvas繪製文字;


各種Span使用

1、字體顏色設置(ForegroundColorSpan)

// 通過String構造SpannableString 
SpannableString spanString = new SpannableString("同一個TextView顯示不同效果");    
// 構造ForegroundColorSpan 
ForegroundColorSpan span = new ForegroundColorSpan(0xfe8026);    
//將ForegroundColorSpan應用於指定範圍的字體
spanString.setSpan(span, 2, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);    
//設置顯示
editText.setText(spanString);  

2、字體背景顏色(BackgroundColorSpan)

SpannableString spanString = new SpannableString("同一個TextView顯示不同效果");    
BackgroundColorSpan span = new BackgroundColorSpan(0xfe8026);    
spanString.setSpan(span, 2, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);    
editText.setText(spanString);    

3、字體大小(AbsoluteSizeSpan)

SpannableString spanString = new SpannableString("同一個TextView顯示不同效果");  
// 這裏的大小是px值,最好通過dp2px轉換一下  
AbsoluteSizeSpan span = new AbsoluteSizeSpan(18);    
spanString.setSpan(span, 2, 5, Spannable.SPAN_INCLUSIVE_INCLUSIVE);    
editText.setText(spanString);   

4、粗體、斜體(StyleSpan)

SpannableString spanString = new SpannableString("同一個TextView顯示不同效果");    
StyleSpan span = new StyleSpan(Typeface.BOLD_ITALIC);    
spanString.setSpan(span, 2, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);    
editText.setText(spanString);   

5、刪除線(StrikethroughSpan)

SpannableString spanString = new SpannableString("同一個TextView顯示不同效果");    
StrikethroughSpan span = new StrikethroughSpan();    
spanString.setSpan(span, 2, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);    
editText.setText(spanString);   

6、下劃線(UnderlineSpan)

SpannableString spanString = new SpannableString("同一個TextView顯示不同效果");    
UnderlineSpan span = new UnderlineSpan();    
spanString.setSpan(span, 2, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);    
editText.setText(spanString);   

7、圖片置換(ImageSpan)

SpannableString spanString = new SpannableString("同一個TextView顯示不同效果");    
Drawable d = getResources().getDrawable(R.drawable.ic_launcher);    
d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());    
ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE);    
spanString.setSpan(span, 2, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);    
editText.setText(spanString);   

html字符串

// 佔坑,有空了再更新。。。

發佈了35 篇原創文章 · 獲贊 52 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章