SpannableString和SpannableStringBuilder總結(jié)

安卓開發(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)以下效果:

  1. 自定義文本中文字的字體大?。òń^對大小和相對大小,區(qū)別看下面解釋)
  2. 設置文本中文字的前景色、背景色
  3. 為文本中的文字設置下劃線,刪除線
  4. 設置文本中的內(nèi)容上標、下標
  5. 為文字設置風格,粗體斜體等
  6. 設置圖文混排,即文字中添加圖片
  7. 可以為部分文本設置點擊事件

以上是一些常用的效果,并不是全部。

下面說一下怎么實現(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一共有四種值可選。如下:

  1. Spannable. SPAN_INCLUSIVE_EXCLUSIVE 前面包括,后面不包括,意思就是在這段文本前部插入新的文本會應用該樣式,而在文本后部插入新文本則不會應用該樣式
  2. Spannable. SPAN_INCLUSIVE_INCLUSIVE 前面包括,后面包括,意思就是在這段文本前部插入新的文本會應用該樣式,在文本后部插入新文本也會應用該樣式
  3. Spanned.SPAN_EXCLUSIVE_EXCLUSIVE 前面不包括,后面不包括
  4. 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的用法,只是一些常用的用法,還有很多東西有待學習。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容