Android TextView Span的使用詳解

轉自:http://www.cnblogs.com/flyme2012/p/3063667b50f3a62dcd29d821123677b1.html

Android中的TextView是個顯示文字的的UI類,在現實中的需求中,文字有各式各樣的樣式,TextView本身沒有屬性去設置實現,我們可以通過Android提供的 SpannableString類封裝。Android提供了很多的Span的類去實現樣式,這個樣式都是繼承自CharacterStyle類。
        要想理解Span的具體使用,那肯定得了解SPan類羣的構成,研究代碼繼承結構,深入的瞭解、理解,才能更好的使用它。我們來統計一下,最前端的可用功能的SPAN有:URLSpan、ClickableSpan、BackgroundColorSpan、ForegroundColorSpan、MaskFilterSpan、AbsoluteSizeSpan、RelativeSizeSpan、ImageSpan、ScaleXSpan、StyleSpan、SubscriptSpan、SuperscriptSpan、TextAppearanceSpan、TypefaceSpan、RasterizerSpan、StrikethroughSpan、UnderlineSpan。
            先看一下Spanable中的常用常量:
             Spanned.SPAN_EXCLUSIVE_EXCLUSIVE --- 不包含start和end所在的端點              (a,b)
             Spanned.SPAN_EXCLUSIVE_INCLUSIVE --- 不包含端start,但包含end所在的端點       (a,b]
             Spanned.SPAN_INCLUSIVE_EXCLUSIVE --- 包含start,但不包含end所在的端點   [a,b)
             Spanned.SPAN_INCLUSIVE_INCLUSIVE--- 包含start和end所在的端點                     [a,b]

效果圖:
123.gif       
用法詳解:(使用很簡單,所以只簡單的解釋,直接上代碼,看效果)
1. SpannableString的使用:
   各種的Span就是通過SpannableString來封裝樣式的,設置完Span之後需要將Span放入到SpannableString類中,然後SpannableString設置到TextView中去。
使用:
          TestText test = (TestText) findViewById(R.id.test);
        SpannableString spannableString = new SpannableString(testText) ;
        BackgroundColorSpan backgroundColorSpan = new BackgroundColorSpan(Color.RED);
        spannableString.setSpan(backgroundColorSpan, 0, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) ;
        test.setText(spannableString) ; 


2. BackgroundColorSpan :看名字就知道是跟背景顏色相關的,
   使用:
       BackgroundColorSpan backgroundColorSpan = new BackgroundColorSpan(Color.RED);
        spannableString.setSpan(backgroundColorSpan, 0, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) ;  

3. ClickableSpan: 點擊事件相關的Span。
   代碼實現:
ClickableSpan clickableSpan = new ClickableSpan() {
            @Override
            public void onClick(View widget) {
                Toast.makeText(MainActivity.this, "click", Toast.LENGTH_SHORT).show();
                Log.e("Easy", "click");
            }
        };
        spannableString.setSpan(clickableSpan, 11, 21, Spannable.SPAN_EXCLUSIVE_INCLUSIVE) ;
        test.setMovementMethod(LinkMovementMethod.getInstance());  
注意:在使用ClickableSpan的時候,在單擊鏈接時凡是有要執行的動作,都必須設置MovementMethod對象。

4. URLSpan:鏈接,類似HTML中的a標籤。
 代碼實現:
        URLSpan urlSpan = new URLSpan("http://www.baidu.com");
        spannableString.setSpan(urlSpan, 22, 32, Spannable.SPAN_INCLUSIVE_EXCLUSIVE) ;  
UrilSpan是繼承自ClickableSpan的,我們可以看一下源碼:
@Override
    public void onClick(View widget) {
        Uri uri = Uri.parse(getURL());
        Context context = widget.getContext();
        Intent intent = new Intent(Intent.ACTION_VIEW, uri);
        intent.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName());
        context.startActivity(intent);
    }  
URILSpan也是實現了onClick的方法,將URL跳轉到瀏覽器中的。  因此,我們可以通過ClickableSpan去做文字的點擊事件。
注意:在使用URLSpan的時候,也需要設置MovementMethod對象。

5. ForegroundColorSpan :設置字體顏色。
代碼實現:
        ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.GRAY);
        spannableString.setSpan(foregroundColorSpan, 32, 43, Spannable.SPAN_INCLUSIVE_INCLUSIVE) ;  


6. MaskFilterSpan:文字的裝飾效果。分爲兩種:BlurMaskFilter(模糊效果) 和 EmbossMaskFilter (浮雕效果)
        MaskFilterSpan maskFilterSpan = new MaskFilterSpan(new EmbossMaskFilter(new float[]{1,1,3}, 1.5f, 8, 3));
        spannableString.setSpan(maskFilterSpan, 44, 55, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) ;
        
        MaskFilter filter2 = new BlurMaskFilter(10, Blur.OUTER );
        MaskFilterSpan maskFilterSpan2 = new MaskFilterSpan(filter2 );
        spannableString.setSpan(maskFilterSpan2, 56, 67, Spannable.SPAN_EXCLUSIVE_INCLUSIVE) ;  

有很陌生的類,我們看一下源碼:(BlurMaskFilter)
 public enum Blur {
        NORMAL(0),    SOLID(1),      OUTER(2),     INNER(3);        
        Blur(int value) {
            native_int = value;
        }
        final int native_int;
    }

    public BlurMaskFilter(float radius, Blur style) {
        native_instance = nativeConstructor(radius, style.native_int);
    }
    private static native long nativeConstructor(float radius, int style);  

啊哦,調用的是native的方法,那我們先記住是如何使用的即可,Blur是其內部類,提供了四種樣式。有興趣的可以一一去實驗其效果。
EmbossMaskFilter是同樣的調用native的方法。

6. AbsoluteSizeSpan:字體大小的
  代碼實現:
                 AbsoluteSizeSpan absoluteSizeSpan = new AbsoluteSizeSpan(100) ;
        spannableString.setSpan(absoluteSizeSpan, 77, 88, Spannable.SPAN_INCLUSIVE_INCLUSIVE) ;
具體的看源碼其實現:
     @Override
    public void updateDrawState(TextPaint ds) {
        if (mDip) {
            ds.setTextSize(mSize * ds.density);
        } else {
            ds.setTextSize(mSize);
        }
    }

可以看出來的是,設置的paint的字體大小,構造函數中的 public AbsoluteSizeSpan(int size, boolean dip)  dip是標識你傳入的數據是否是dp數值。

7. RelativeSizeSpan:相對的字體大小
這個是什麼意思那?看源碼就知道了:
@Override
    public void updateDrawState(TextPaint ds) {
        ds.setTextSize(ds.getTextSize() * mProportion);
    } 
原來是字體大小的多少倍啊。

8. ImageSpan:有關圖片的。
代碼實現:
        ImageSpan imageSpan = new ImageSpan(MainActivity.this, R.drawable.ic_launcher) ;
        spannableString.setSpan(imageSpan, 100, 105, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) ;  
這個類有很多的構造函數,其作用就是通過不同方式傳入drawble,可以資源地址,可以是Drawable  也可以是uri

9. ScaleXSpan:橫向壓縮比例因子。
 
 10. StyleSpan :主要由正常、粗體、斜體和同時加粗傾斜四種樣式,常量值定義在Typeface類中。
Typeface.DEFAULT //常規字體類型
Typeface.DEFAULT_BOLD //黑體字體類型
Typeface.MONOSPACE //等寬字體類型
Typeface.SANS_SERIF //sans serif字體類型
Typeface.SERIF //serif字體類型

11. SubscriptSpan: 腳註樣式,比如化學式的常見寫法,當然,還可以對腳註的文字做一定的縮放
看一下源碼:
SubscriptSpan():無參構造。
SubscriptSpan(Parcel src):一參構造,參數src並未起任何作用,源碼中爲:
public SuperscriptSpan(Parcel src) {
}   這個是比較特殊的地方。這個構造函數沒有任何作用。

12. SuperscriptSpan:上標樣式,比如數學上的次方運算,當然,還可以對上標文字進行縮放。同11樣式的作用剛好相反。

13.TextAppearanceSpan:使用style文件來定義文本樣式。

14.TypefaceSpan:字體樣式,可以設置不同的字體

15.RasterizerSpan:設置光柵字樣

16.StrikethroughSpan:刪除線
17.UnderlineSpan : 下劃線


使用起來是很簡單的,主要是分析Span的原理。下一篇文章,來分析Span的深層次源碼。


發佈了49 篇原創文章 · 獲贊 41 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章