Android查缺補漏之SpannableString

TextView是Android開發中一種很常用的控件,經常用來展示文字內容。但有的時候爲了帶來更好的用戶體驗,往往需要很炫的樣式,如果只是通過使用多個TextView進行堆疊未免過於繁瑣,因此我們使用SpannableString對於TextView進行設置。


1.普通的TextView

首先我們先來看一看一般的TextView,一般而言,每一個TextView包含一種字體和顏色。
在xml佈局中添加一個TextView控件
    <TextView
        android:textSize="25dp"
        android:id="@+id/text"
        android:text="http://blog.csdn.net/steveyg"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"/>
然後在Activity中對空間進行綁定
        setContentView(R.layout.activity_main);
        TextView tv = (TextView)findViewById(R.id.text);
最後的樣式如下圖所示


2.構建SpannableString

當我們希望使用SpannableString設置字符串樣式時,一般需要先創建一個SpannableString對象
SpannableString spanText = new SpannableString("http://blog.csdn.net/steveyg");
然後調用setSpan方法對於樣式進行設置
spanText.setSpan(new BackgroundColorSpan(Color.BLUE), 0, spanText.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
我們可以看到這個方法裏面共有四個參數,第一個參數是用來指定實現某種效果(比如背景色,超鏈接等),第二個和第三個參數表示其實的位置和結束的位置,而第四個參數表示實現的類型,可以在Spanned.java中看到全部的類型,常用的有如下四種:

  • SPAN_EXCLUSIVE_EXCLUSIVE 不包含起點和終點
  • SPAN_EXCLUSIVE_INCLUSIVE  不包含起點但包含終點
  • SPAN_INCLUSIVE_EXCLUSIVE  包含起點但不包含終點
  • SPAN_INCLUSIVE_INCLUSIVE·  包含起點和終點

3.背景色

使用BackgroundColorSpan可以對背景色進行設置
spanText.setSpan(new BackgroundColorSpan(Color.BLUE), 4, spanText.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);


4.前景色

使用ForegroundColorSpan可以對前景色進行設置
spanText.setSpan(new ForegroundColorSpan(Color.BLUE) , 0, spanText.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

5.中劃線

使用StrikethroughSpan可以實現文字的中劃線效果
spanText.setSpan(new StrikethroughSpan(), 0, spanText.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

6.下劃線

使用UnderlineSpan 可以實現文字的下劃線效果


7.設置字號大小

使用AbsoluteSizeSpan可以改變字號的絕對大小,而RelativeSizeSpan 可以改變字體的相對大小(相對當前字號)
spanText.setSpan(new AbsoluteSizeSpan(40, true), 0,4, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
spanText.setSpan(new RelativeSizeSpan(2.5f), 0,4, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

8.設置圖片

通過DynamicDrawableSpan或ImageSpan可以將制定位置的字符替換成圖片
        DynamicDrawableSpan drawableSpan =
        new DynamicDrawableSpan(DynamicDrawableSpan.ALIGN_BASELINE) {
            @Override
            public Drawable getDrawable() {
                Drawable d = getResources().getDrawable(R.mipmap.ic_launcher);
                d.setBounds(0, 0, 50, 50);
                return d;
            }
        };

        Drawable d = getResources().getDrawable(R.mipmap.ic_launcher);
        d.setBounds(0, 0, 50, 50);
        spanText.setSpan(new ImageSpan(d), 0,1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);



9.水平縮放

使用ScaleXSpan可以對字符串進行水平縮放
 spanText.setSpan(new ScaleXSpan(2.5f), 0,5, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

10.改變字體樣式

使用StyleSpan可以改變字體樣式(斜體、粗體等),樣式見Typeface
spanText.setSpan(new StyleSpan(Typeface.ITALIC), 0,5, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);


11.上下角標

使用SubscriptSpan可以實現下角標
spanText.setSpan(new SubscriptSpan(), 0,1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

類似的,可以使用SuperscriptSpan實現上角標


12.修改字體

使用TypefaceSpan可以修改文字字體,如果修改爲自定義的字體,需要重寫TypefaceSpan
spanText.setSpan(new TypefaceSpan("monospace"), 0,5, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

13.超鏈接

使用URLSpan可以實現超鏈接的效果
        spanText.setSpan(new URLSpan("http://blog.csdn.net/steveyg"), 0,5, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
        tv.setText(spanText);
        tv.setMovementMethod(new LinkMovementMethod());//點擊事件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章