天天看點

TextView 的SpannableString使用

一、SpannableString,SpannableStringBuilder與String的關系

首先SpannableString、SpannableStringBuilder基本上與String差不多,也是用來存儲字元串,SpannableStringBuilder和SpannableString特殊就在于有一個SetSpan()函數,能給這些存儲的String添加各種格式或者稱樣式(Span),将原來的String以不同的樣式顯示出來,比如在原來String上加下劃線、加背景色、改變字型顔色、用圖檔把指定的文字給替換掉,等等。

二、SetSpan()

void setSpan (Object what, int start, int end, int flags)

給SpannableString或SpannableStringBuilder特定範圍的字元串設定Span樣式,可以設定多個(比如同時加上下劃線和删除線等),Falg參數辨別了當在所标記範圍前和标記範圍後緊貼着插入新字元時的動作,即是否對新插入的字元應用同樣的樣式。

參數說明:

object what :

對應的各種Span,後面會提到;

int start:

開始應用指定Span的位置,索引從0開始

int end:

結束應用指定Span的位置,特效并不包括這個位置。比如如果這裡數為3(即第4個字元),第4個字元不會有任何特效。

int flags(取值有如下四個):

Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前後都不包括,即在指定範圍的前面和後面插入新字元都不會應用新樣式

Spannable.SPAN_EXCLUSIVE_INCLUSIVE:前面不包括,後面包括。即僅在範圍字元的後面插入新字元時會應用新樣式

Spannable.SPAN_INCLUSIVE_EXCLUSIVE:前面包括,後面不包括。

Spannable.SPAN_INCLUSIVE_INCLUSIVE:前後都包括。

三、各種Span設定

要使用一個Span總共分三步:

1、構造SpannableString

2、構造對應Span

3、利用SetSpan()對指定範圍的String應用這個Span

1、字型顔色設定(ForegroundColorSpan)

//建構一個SpannableString,設定要顯示的内容

SpannableString colorString = new SpannableString(“字型内容”);

//構造一個改變字型顔色的Span

ForegroundColorSpan colorSpan = new ForegroundColorSpan(Color.RED);

//将這個Span應用于指定範圍的字型

colorString.setSpan(colorSpan, 1, 3, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);

//設定給TextView顯示出來

color_tv.setText(colorString);

2、字型背景顔色(BackgroundColorSpan)

SpannableString backgroundColorString = new SpannableString(“字型内容”);

BackgroundColorSpan bcs=new BackgroundColorSpan(Color.RED);

bcs.setSpan(backgroundColorSpan,0,3,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

background_color_tv.setText(bcs);

3.字型大小(AbsoluteSizeSpan)

SpannableString absoluteSizeString = new SpannableString(“字型内容”);

AbsoluteSizeSpan absoluteSizeSpan = new AbsoluteSizeSpan(16);

absoluteSizeString.setSpan(absoluteSizeSpan,2,5,Spannable.SPAN_INCLUSIVE_INCLUSIVE);

absolute_size_tv.setText(absoluteSizeString);

4、粗體、斜體(StyleSpan)

SpannableString styleString = new SpannableString(“字型内容”);

StyleSpan styleSpan = new StyleSpan(Typeface.BOLD_ITALIC);

styleString.setSpan(styleSpan, 1, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

style_tv.setText(styleString);

5、删除線(StrikethroughSpan)

SpannableString strikethroughString = new SpannableString(“字型内容”);

StrikethroughSpan strikethroughSpan = new StrikethroughSpan();

strikethroughString.setSpan(strikethroughSpan,2,5,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

strikethrough_tv.setText(strikethroughString);

6、下劃線(UnderlineSpan)

TextView underline_tv=(TextView) findViewById(R.id.underline_tv);

SpannableString underlineString = new SpannableString(“字型内容”);

UnderlineSpan underlineSpan = new UnderlineSpan();

underlineString.setSpan(underlineSpan,1,4,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

underline_tv.setText(underlineString);

7、圖檔置換,圖文混排 (ImageSpan)

Drawable drawable

= getResources().getDrawable(R.drawable.shoppingcar_number);

//Intrinsic:本來的,固有的

drawable.setBounds(0,0,drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());

//需要處理的文本,[圖檔]是需要被替代的文本

SpannableString drawableSpannable = new SpannableString(“[圖檔]” + “将文字替換為圖檔,圖檔可以處于任何位置”);

ImageSpan imageSpan

= new ImageSpan(drawable, ImageSpan.ALIGN_BOTTOM);

// 開始替換

drawableSpannable.setSpan(imageSpan,0,

“[圖檔]”.length(),Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

picture_text_tv.setText(drawableSpannable);

8、文本點選事件(ClickableSpan)

SpannableString clickString = new SpannableString(“點選”);

clickString.setSpan(new MyClickableSpan(new OnClickListener() {

@Override

public void onClick(View v) {

Toast.makeText(MainActivity.this, “被點選啦”, Toast.LENGTH_LONG).show();

}

}), 0, clickString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

click_tv.setText(“前面的文字”);

click_tv.append(clickString);

click_tv.append(“後面的文字”);

//設定開始響應點選事件

click_tv.setMovementMethod(LinkMovementMethod.getInstance();

//設定不觸發長按事件

click_tv.setLongClickable(false);

//設定點選後的顔色為透明,否則會一直出現高亮

click_tv.setHighlightColor(Color.TRANSPARENT);

private class MyClickableSpan

extends ClickableSpan implements OnClickListener {

private OnClickListener mListener;

public MyClickableSpan(OnClickListener mListener) {

this.mListener = mListener;

}

@Override

public void onClick(View widget) {

if(mListener!=null){

mListener.onClick(widget);

}

}

@Override

public void updateDrawState(TextPaint ds) {

ds.setColor(ds.linkColor);

}

}

注:主要的Span對象

1、BackgroundColorSpan 背景色

2、ClickableSpan 文本可點選,有點選事件

3、ForegroundColorSpan 文本顔色(前景色)

4、MaskFilterSpan 修飾效果,如模糊(BlurMaskFilter)、浮雕(EmbossMaskFilter)

5、MetricAffectingSpan 父類,一般不用

6、RasterizerSpan 光栅效果

7、StrikethroughSpan 删除線(中劃線)

8、SuggestionSpan 相當于占位符

9、UnderlineSpan 下劃線

10、AbsoluteSizeSpan 絕對大小(文本字型)

11、DynamicDrawableSpan 設定圖檔,基于文本基線或底部對齊。

12、ImageSpan 圖檔

13、RelativeSizeSpan 相對大小(文本字型)

14、ReplacementSpan 父類,一般不用

15、ScaleXSpan 基于x軸縮放

16、StyleSpan 字型樣式:粗體、斜體等

17、SubscriptSpan 下标(數學公式會用到)

18、SuperscriptSpan 上标(數學公式會用到)

19、TextAppearanceSpan 文本外貌(包括字型、大小、樣式和顔色)

20、TypefaceSpan 文本字型

21、URLSpan 文本超連結

下載下傳資源:http://download.csdn.net/detail/u011975949/8992915