安卓開發(fā)中TextView 是我們最常用的控件之一,我們用TextView為我們在頁面中展示文本。展示普通文本當然沒有任何難度,使用TextView的setText()方法設置一個字符串就可以了,但是當我們需要在文本中展示不同格式文本的時候,設置普通的字符串就不行了。那該怎么辦?當然就說到我們今天的主角了。SpannableString和SpannableStringBuilder
首先來說SpannableString
SpannableString和String一樣都是一種字符串類型,他們都實現(xiàn)了CharSequence,所以SpannableString也可以直接使用TextView的setText()方法設置文本。SpannableString的特別之處就在于SpannableString可以打造豐富多彩的文本顯示效果。SpannableString可以通過使用其方法setSpan()實現(xiàn)字符串各種形式風格的顯示,重要的是可以指定設置的區(qū)間,也就是為字符串指定下標區(qū)間內(nèi)的子字符串設置格式。
可以輕松實現(xiàn)以下效果:
- 自定義文本中文字的字體大?。òń^對大小和相對大小,區(qū)別看下面解釋)
- 設置文本中文字的前景色、背景色
- 為文本中的文字設置下劃線,刪除線
- 設置文本中的內(nèi)容上標、下標
- 為文字設置風格,粗體斜體等
- 設置圖文混排,即文字中添加圖片
- 可以為部分文本設置點擊事件
以上是一些常用的效果,并不是全部。
下面說一下怎么實現(xiàn)這些效果。
SpannableString有一個方法叫做setSpan(),我們就是用這個方法來實現(xiàn)不同展示效果的。
這個方法如下所示:
public void setSpan(Object what, int start, int end, int flags) {
super.setSpan(what, start, end, flags);
}
setSpan()方法有四個參數(shù),其中what就是所要設置的格式,start是需要設置格式的子字符串的起始下標,end就是結(jié)束下標,但并不包括這個位置。flag一共有四種值可選。如下:
- Spannable. SPAN_INCLUSIVE_EXCLUSIVE 前面包括,后面不包括,意思就是在這段文本前部插入新的文本會應用該樣式,而在文本后部插入新文本則不會應用該樣式
- Spannable. SPAN_INCLUSIVE_INCLUSIVE 前面包括,后面包括,意思就是在這段文本前部插入新的文本會應用該樣式,在文本后部插入新文本也會應用該樣式
- Spanned.SPAN_EXCLUSIVE_EXCLUSIVE 前面不包括,后面不包括
- Spanned.SPAN_EXCLUSIVE_INCLUSIVE 前面不包括,后面包括
這里先看一個SpannableString的簡單實現(xiàn):
TextView main_tv=findViewById(R.id.main_tv);
SpannableString ss=new SpannableString("其實我是一個好人");
ForegroundColorSpan foregroundColorSpan=new ForegroundColorSpan(Color.parseColor("#FF0000"));
ss.setSpan(foregroundColorSpan,2,6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
main_tv.setText(ss);
上述代碼實現(xiàn)的效果是:
SpannableString的setSpan()方法可以同時使用多個,實現(xiàn)多種效果疊加。
setSpan()方法中的what是最重要的一個參數(shù),對應各種span,不同的span對應不同的樣式。接下來我們就來看一下不同的幾種常見的span以及效果。
為文本設置背景色 BackgroundColorSpan
代碼如下:
TextView main_tv=findViewById(R.id.main_tv);
SpannableString ss=new SpannableString("其實我是一個好人");
BackgroundColorSpan backgroundColorSpan=new BackgroundColorSpan(Color.parseColor("#FFFF00"));
ss.setSpan(backgroundColorSpan,2,6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
main_tv.setText(ss);
效果如圖:
為文本設置下劃線以及刪除線
UnderlineSpan:下劃線
StrikethroughSpan :刪除線
代碼示例:
TextView main_tv=findViewById(R.id.main_tv);
SpannableString ss=new SpannableString("其實我是一個好人");
UnderlineSpan underlineSpan=new UnderlineSpan();//下劃線span
StrikethroughSpan strikethroughSpan=new StrikethroughSpan();//刪除線
ss.setSpan(underlineSpan,3,6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ss.setSpan(strikethroughSpan,0,3,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
main_tv.setText(ss);
效果展示:
設置文本字體 AbsoluteSizeSpan (設置的是絕對大小,直接用具體數(shù)值指定文字大?。?/strong>
代碼:
TextView main_tv=findViewById(R.id.main_tv);
SpannableString ss=new SpannableString("其實我是一個好人");
AbsoluteSizeSpan absoluteSizeSpan=new AbsoluteSizeSpan(30,true);
ss.setSpan(absoluteSizeSpan,3,6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
main_tv.setText(ss);
效果如圖:
設置文本字體 RelativeSizeSpan(設置的是相對大小,在TextView原有的文字大小的基礎(chǔ)上,相對設置文字大?。?/strong>
代碼如下:
TextView main_tv=findViewById(R.id.main_tv);
SpannableString ss=new SpannableString("其實我是一個好人");
RelativeSizeSpan relativeSizeSpan=new RelativeSizeSpan(0.5f);
ss.setSpan(relativeSizeSpan,3,6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
main_tv.setText(ss);
效果:
設置字體樣式(粗體、斜體等) StyleSpan
代碼:
TextView main_tv=findViewById(R.id.main_tv);
SpannableString ss=new SpannableString("其實我是一個好人");
StyleSpan styleSpan=new StyleSpan(Typeface.BOLD);
ss.setSpan(styleSpan,3,6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
main_tv.setText(ss);
效果:
設置文本中的內(nèi)容上標 SuperscriptSpan 、下標SubscriptSpan
代碼:
TextView main_tv=findViewById(R.id.main_tv);
SpannableString ss=new SpannableString("其實我是一個好人");
SuperscriptSpan superscriptSpan=new SuperscriptSpan();//上標
SubscriptSpan subscriptSpan=new SubscriptSpan();//下標
//ss.setSpan(superscriptSpan,3,5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ss.setSpan(subscriptSpan,0,2,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
main_tv.setText(ss);
文本中插入圖片 ImageSpan
代碼:
TextView main_tv=findViewById(R.id.main_tv);
SpannableString ss=new SpannableString("其實我是一個好人");
ImageSpan imageSpan=new ImageSpan(this,R.mipmap.ic_launcher);
ss.setSpan(imageSpan,2,3,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
main_tv.setText(ss);
效果:
給部分文本設置點擊事件 ClickableSpan
TextView main_tv=findViewById(R.id.main_tv);
SpannableString ss=new SpannableString("其實我是一個好人");
ClickableSpan clickableSpan=new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(SecondActivity.this, "點擊了", Toast.LENGTH_SHORT).show();
}
};
ss.setSpan(clickableSpan,2,4,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
main_tv.setText(ss);
main_tv.setMovementMethod(LinkMovementMethod.getInstance());
使用ClickableSpan設置點擊事件,最后還需要加上main_tv.setMovementMethod(LinkMovementMethod.getInstance())這一句,不然不生效。
效果:
以上就是一些常用的span
接著說SpannableStringBuilder
SpannableStringBuilder 與 SpannableString 的區(qū)別就和string 與 stringBuilder 的區(qū)別類似。就是SpannableStringBuilder可以使用append()方法拼接,而SpannableString不可拼接。其他沒有多大區(qū)別。
以上簡單總結(jié)了一下SpannableStringBuilder和SpannableString的用法,只是一些常用的用法,還有很多東西有待學習。