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的深層次源碼。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。