Android之TextView的樣式類Span的使用詳解,androidtextview

來源:互聯網
上載者:User

Android之TextView的樣式類Span的使用詳解,androidtextview
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]
:       
用法詳解:(使用很簡單,所以只簡單的解釋,直接上代碼,看效果)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的深層次源碼。

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.