TextView一般用來顯示普通文本,可是有時候須要對其中某些文本進行樣式、事件方面的設置。Android系統經過SpannableString類來對指定文本進行相關處理,具體有如下功能:android
一、BackgroundColorSpan 背景色
二、ClickableSpan 文本可點擊,有點擊事件
三、ForegroundColorSpan 文本顏色(前景色)
四、MaskFilterSpan 修飾效果,如模糊(BlurMaskFilter)、浮雕(EmbossMaskFilter)
五、MetricAffectingSpan 父類,通常不用
六、RasterizerSpan 光柵效果
七、StrikethroughSpan 刪除線(中劃線)
八、SuggestionSpan 至關於佔位符
九、UnderlineSpan 下劃線
十、AbsoluteSizeSpan 絕對大小(文本字體)
十一、DynamicDrawableSpan 設置圖片,基於文本基線或底部對齊。
十二、ImageSpan 圖片
1三、RelativeSizeSpan 相對大小(文本字體)
1四、ReplacementSpan 父類,通常不用
1五、ScaleXSpan 基於x軸縮放
1六、StyleSpan 字體樣式:粗體、斜體等
1七、SubscriptSpan 下標(數學公式會用到)
1八、SuperscriptSpan 上標(數學公式會用到)
1九、TextAppearanceSpan 文本外貌(包括字體、大小、樣式和顏色)
20、TypefaceSpan 文本字體
2一、URLSpan 文本超連接app
使用方法
字體
可使用建立一個SpannableString或 SpannableStringBuilder,它們的區別在於 SpannableString像一個String同樣,構造對象的時候傳入一個String,以後再沒法更改String的內容,也沒法拼接多個 SpannableString;而SpannableStringBuilder則更像是StringBuilder,它能夠經過其append()方 法來拼接多個String:ui
方式一
SpannableString word = new SpannableString("The quick fox jumps over the lazy dog"); 方式二 SpannableStringBuilder multiWord = new SpannableStringBuilder(); multiWord.append("The Quick Fox"); multiWord.append("jumps over"); multiWord.append("the lazy dog");
經過設置setSpan方法spa
/** * Set the style span to Spannable, such as SpannableString or SpannableStringBuilder * @param what --- the style span, such as StyleSpan * @param start --- the starting index of characters to which the style span to apply * @param end --- the ending index of characters to which the style span to apply * @param flags --- the flag specified to control */ setSpan(Object what, int start, int end, int flags);
其中參數what是要設置的Style span,start和end則是標識String中Span的起始位置,而 flags是用於控制行爲的,一般設置爲0或Spanned中定義的常量,經常使用的有:code
這裏理解起來就好像數學中定義區間,開區間仍是閉區間同樣。還有許多其餘的Flag,這裏要重點說明下關於參數0,有不少時候,若是設置了上述的參數,那麼Span會從start應用到Text結尾,而不是在start和end兩者之間,這個時候就須要使用Flag 0。對象
一些方法:blog
/** * 超連接 */ private void addUrlSpan() { SpannableString spanString = new SpannableString("超連接"); URLSpan span = new URLSpan("tel:0123456789"); spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); tv.append(spanString); } /** * 文字背景顏色 */ private void addBackColorSpan() { SpannableString spanString = new SpannableString("顏色2"); BackgroundColorSpan span = new BackgroundColorSpan(Color.YELLOW); spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); tv.append(spanString); } /** * 文字顏色 */ private void addForeColorSpan() { SpannableString spanString = new SpannableString("顏色1"); ForegroundColorSpan span = new ForegroundColorSpan(Color.BLUE); spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); tv.append(spanString); } /** * 字體大小 */ private void addFontSpan() { SpannableString spanString = new SpannableString("36號字體"); AbsoluteSizeSpan span = new AbsoluteSizeSpan(36); spanString.setSpan(span, 0, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); tv.append(spanString); } /** * 粗體,斜體 */ private void addStyleSpan() { SpannableString spanString = new SpannableString("BIBI"); StyleSpan span = new StyleSpan(Typeface.BOLD_ITALIC); spanString.setSpan(span, 0, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); tv.append(spanString); } /** * 刪除線 */ private void addStrikeSpan() { SpannableString spanString = new SpannableString("刪除線"); StrikethroughSpan span = new StrikethroughSpan(); spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); tv.append(spanString); } /** * 下劃線 */ private void addUnderLineSpan() { SpannableString spanString = new SpannableString("下劃線"); UnderlineSpan span = new UnderlineSpan(); spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); tv.append(spanString); } /** * 圖片 */ private void addImageSpan() { SpannableString spanString = new SpannableString(" "); 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, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); tv.append(spanString); }