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


       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的深層次源碼。








附件列表

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM