天天看點

Android TextView 設定不同字型樣式神器SpannableString

TextView相信大家都不陌生,在Android代碼中無處不在。正常的用法是一個TextView裡面隻有一種字型樣式,如果想設定花樣TextView,就需要用到SpannableString了。下面給大家介紹一個SpannableString的正常用法。

SpannableString關鍵的方法就兩個:

 public void setSpan(Object what, int start, int end, int flags) {}

 public void removeSpan(Object what) {}    

remove方法相信大家都懂了,就是移除樣式。下面重點給大家分析一下setSpan方法。setSpan方法有四個參數:

Object what:指各種Span的類型,詳見下面說明。

int start:需要設定的文字的起始位置;

int end:需要設定的文字的結束位置;

int flag:這個參數主要是設定span的起始和結束位置包含或不包含的類型。主要有四種類型,詳見下面說明。

flag取值:

  • Spannable. SPAN_INCLUSIVE_EXCLUSIVE

    :前面包括,後面不包括,即在文本前插入新的文本會應用該樣式,而在文本後插入新文本不會應用該樣式;
  • Spannable. SPAN_INCLUSIVE_INCLUSIVE

    :前面包括,後面包括,即在文本前插入新的文本會應用該樣式,而在文本後插入新文本也會應用該樣式;
  • Spannable. SPAN_EXCLUSIVE_EXCLUSIVE

    :前面不包括,後面不包括,同上;
  • Spannable. SPAN_EXCLUSIVE_INCLUSIVE

    :前面不包括,後面包括,同上。

what常用取值:

  • BackgroundColorSpan

     : 文本背景色
  • ForegroundColorSpan

     : 文本顔色
  • MaskFilterSpan

     : 修飾效果,如模糊(BlurMaskFilter)浮雕
  • RasterizerSpan

     : 光栅效果
  • StrikethroughSpan

     : 删除線
  • SuggestionSpan

     : 相當于占位符
  • UnderlineSpan

     : 下劃線
  • AbsoluteSizeSpan

     : 文本字型(絕對大小),這裡有兩個參數 (int size, boolean dip),size:預設機關為px。 dip:true為size的機關是dip,false為px。
  • DynamicDrawableSpan

     : 設定圖檔,基于文本基線或底部對齊。
  • ImageSpan

     : 圖檔
  • RelativeSizeSpan

     : 相對大小(文本字型)
  • ScaleXSpan

     : 基于x軸縮放
  • StyleSpan

     : 字型樣式:粗體、斜體等
  • SubscriptSpan

     : 下标(數學公式會用到)
  • SuperscriptSpan

     : 上标(數學公式會用到)
  • TextAppearanceSpan

     : 文本外貌(包括字型、大小、樣式和顔色)
  • TypefaceSpan

     : 文本字型
  • URLSpan

     : 文本超連結
  • ClickableSpan

     : 點選事件  在設定ClickableSpan的時候千萬别忘了setMovementMethod。

關于what參數的更詳細用法可以參考:https://blog.csdn.net/qq_16430735/article/details/50427978

下面貼出簡單應用代碼:

Spannable spannable = new SpannableString("SpanableString設定不同字型樣式神器");
spannable.setSpan(new StyleSpan(Typeface.BOLD), 0, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannable.setSpan(new AbsoluteSizeSpan(15,true),3,8,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textview.setText(spannable);
           

最後,分享一個小經驗:

之前在封裝自定義元件的時候,總會把設定文字的方法寫成setContent(String content);參數類型為String,導緻後面想修改一下text文字的不同樣式都比較麻煩。

我們們可以改成setContent(CharSequence content),參數類型為CharSequence,我們就可以直接傳SpannableString或者String了。這樣擴充性就好很多了。

繼續閱讀