Android使用Span打造豐富多彩的文本詳解
1.引言
在開發(fā)過程中經(jīng)常需要使用文本,有時(shí)候需要對(duì)一段文字中的部分文字進(jìn)行特殊的處理,如改變其中部分文字的大小、顏色、加下劃線等,這個(gè)時(shí)候使用Span就能方便地解決這些問題。本文將主要介紹SpannableStringBuilder和各種Span的使用。
2.SpannableStringBuilder的基本用法
新建一個(gè)SpannableStringBuilder對(duì)象的操作如下:
SpannableStringBuilder builder = new SpannableStringBuilder("Hello World!");SpannableStringBuilder的setSpan()方法如下:
//what:各種文本Span,如BackgroundColorSpan、ForegroundColorSpan等
//start:應(yīng)用Span的文本的開始位置索引
//end:應(yīng)用Span的文本的結(jié)束位置索引
//flags:標(biāo)志
public void setSpan(Object what, int start, int end, int flags) {
setSpan(true, what, start, end, flags, true/*enforceParagraph*/);
}3.使用Span給文本添加效果
3.1 AbsoluteSizeSpan
此Span用來改變文本的絕對(duì)大小,示例如下:
SpannableStringBuilder builder = new SpannableStringBuilder("Hello World!");
builder.setSpan(new AbsoluteSizeSpan(60),3,9, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
tv_content.setText(builder); 3.2 BackgroundColorSpan
此Span用來改變文本的背景顏色大小,示例如下:
SpannableStringBuilder builder = new SpannableStringBuilder("Hello World!");
builder.setSpan(new BackgroundColorSpan(Color.GREEN),3,9, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
tv_content.setText(builder);3.3 ClickableSpan
此Span用來給文本添加點(diǎn)擊效果,示例如下:
SpannableStringBuilder builder = new SpannableStringBuilder("Hello World!");
builder.setSpan(new ClickableSpan() {
@Override
public void onClick(@NonNull View widget) {
Toast.makeText(MainActivity.this,"ClickableSpan",Toast.LENGTH_SHORT).show();
}
}, 3, 9, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
tv_content.setText(builder);
tv_content.setMovementMethod(LinkMovementMethod.getInstance());
tv_content.setHighlightColor(Color.TRANSPARENT);3.4 DrawableMarginSpan
此Span用來給段落添加drawable和padding,這個(gè)padding指的是drawable和文本之間的距離,默認(rèn)值是0,Span要從文本的起始位置設(shè)置,否則Span將不會(huì)渲染或者錯(cuò)誤地渲染,示例如下:
SpannableStringBuilder builder = new SpannableStringBuilder("Hello World!");
Drawable drawable = AppCompatResources.getDrawable(MainActivity.this,R.drawable.ic_launcher);
builder.setSpan(new DrawableMarginSpan(drawable,30), 0, builder.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
tv_content.setText(builder);3.5 DynamicDrawableSpan
此Span使用drawable替換文本內(nèi)容,示例如下:
SpannableStringBuilder builder = new SpannableStringBuilder("Hello World!");
builder.setSpan(new DynamicDrawableSpan() {
@Override
public Drawable getDrawable() {
Drawable drawable =
AppCompatResources.getDrawable(MainActivity.this,R.drawable.ic_launcher);
drawable.setBounds(0,0,drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());
return drawable;
}
}, 3, 9, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
tv_content.setText(builder);3.6 ForegroundColorSpan
此Span可以用來改變文本的顏色,示例如下:
SpannableStringBuilder builder = new SpannableStringBuilder("Hello World!");
builder.setSpan(new ForegroundColorSpan(Color.GREEN), 3, 9, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
tv_content.setText(builder);3.7 IconMarginSpan
此Span可以在文本開始的地方添加位圖,而且可以在位圖和文本之間設(shè)置padding,padding的默認(rèn)值是0px,示例如下:
SpannableStringBuilder builder = new SpannableStringBuilder("Hello World!");
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
builder.setSpan(new IconMarginSpan(bitmap,30), 0, builder.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
tv_content.setText(builder);3.8 ImageSpan
此Span可以使用Drawable替換文本,創(chuàng)建ImageSpan的構(gòu)造方法有很多,示例如下:
SpannableStringBuilder builder = new SpannableStringBuilder("Hello World!");
builder.setSpan(new ImageSpan(MainActivity.this,R.drawable.ic_launcher), 3, 9, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
tv_content.setText(builder);3.9 MaskFilterSpan
此Span可以給文本設(shè)置MaskFilter,例如給文本設(shè)置模糊效果,示例如下:
SpannableStringBuilder builder = new SpannableStringBuilder("Hello World!");
MaskFilter maskFilter = new BlurMaskFilter(10f, BlurMaskFilter.Blur.NORMAL);
builder.setSpan(new MaskFilterSpan(maskFilter), 3, 9, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
tv_content.setText(builder);3.10 QuoteSpan
此Span可以在文本開始的地方添加一個(gè)垂直的線條,示例如下:
SpannableStringBuilder builder = new SpannableStringBuilder("Hello World!");
builder.setSpan(new QuoteSpan(Color.GREEN), 0, builder.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
tv_content.setText(builder);3.11 RelativeSizeSpan
此Span可以按一定的比例縮放文本的大小,示例如下:
SpannableStringBuilder builder = new SpannableStringBuilder("Hello World!");
builder.setSpan(new RelativeSizeSpan(2.0f), 3, 9, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
tv_content.setText(builder);3.12 ScaleXSpan
此Span以一定的系數(shù)在水平方向縮放文本的大小,示例如下:
SpannableStringBuilder builder = new SpannableStringBuilder("Hello World!");
builder.setSpan(new ScaleXSpan(2.5f), 3, 9, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
tv_content.setText(builder);3.13 StrikethroughSpan
此Span可以在文本上添加下劃線,示例如下:
SpannableStringBuilder builder = new SpannableStringBuilder("Hello World!");
builder.setSpan(new StrikethroughSpan(), 3, 9, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
tv_content.setText(builder);3.14 StyleSpan
此Span可以設(shè)置文本的樣式,可用的樣式有Typeface.NORMAL、Typeface.BOLD、Typeface.ITALIC、Typeface.BOLD_ITALIC,示例如下:
SpannableStringBuilder builder = new SpannableStringBuilder("Hello World!");
builder.setSpan(new StyleSpan(Typeface.BOLD), 3, 9, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
tv_content.setText(builder);3.15 SubscriptSpan
此Span可以將文本的基線移動(dòng)到更低的地方,示例如下:
SpannableStringBuilder builder = new SpannableStringBuilder("Hello World!");
builder.setSpan(new SubscriptSpan(), 3, 9, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
tv_content.setText(builder);3.16 SuperscriptSpan
此Span可以將文本的基線移動(dòng)到更高的地方,示例如下:
SpannableStringBuilder builder = new SpannableStringBuilder("Hello World!");
builder.setSpan(new SuperscriptSpan(), 3, 9, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
tv_content.setText(builder);3.17 UnderlineSpan()
此Span可以在文本下面添加下劃線,示例如下:
SpannableStringBuilder builder = new SpannableStringBuilder("Hello World!");
builder.setSpan(new UnderlineSpan(), 3, 9, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
tv_content.setText(builder);4.多個(gè)Span組合使用
Span不但可以單獨(dú)使用,還可以組合在一起使用,以下示例演示了如何同時(shí)加粗文字,改變文字的顏色和添加下滑線:
SpannableStringBuilder builder = new SpannableStringBuilder("Hello World!");
builder.setSpan(new UnderlineSpan(), 3, 9, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
builder.setSpan(new ForegroundColorSpan(Color.GREEN), 3, 9, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
builder.setSpan(new StyleSpan(Typeface.BOLD), 3, 9, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
tv_content.setText(builder);5.總結(jié)
Span的功能相當(dāng)豐富,如改變文本顏色、大小、添加點(diǎn)擊效果、加下劃線等功能,本文介紹了經(jīng)常用到的各種Span,Span支持單獨(dú)使用和組合使用,使用它能夠?qū)ξ谋具M(jìn)行各種靈活的操作,去實(shí)現(xiàn)個(gè)性化的需求。
到此這篇關(guān)于Android使用Span打造豐富多彩的文本詳解的文章就介紹到這了,更多相關(guān)Android Span文本內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android開場(chǎng)動(dòng)畫類完整實(shí)現(xiàn)代碼
這篇文章主要介紹了Android開場(chǎng)動(dòng)畫類完整實(shí)現(xiàn)代碼,是非常實(shí)用的功能,需要的朋友可以參考下2014-07-07
Android?studio實(shí)現(xiàn)單選按鈕
這篇文章主要為大家詳細(xì)介紹了Android?studio實(shí)現(xiàn)單選按鈕,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
Android 調(diào)用設(shè)備已有的相機(jī)應(yīng)用詳情
這篇文章主要介紹了Android 調(diào)用設(shè)備已有的相機(jī)應(yīng)用,如果我們只是需要讓用戶能夠拍攝照片,則可以直接請(qǐng)求已有相機(jī)應(yīng)用拍攝照片并將照片返回給我們,下面我們一起來看看這些功能,需要的朋友可以參考一下2021-10-10
Android自定義View之酷炫數(shù)字圓環(huán)
這篇文章主要為大家詳細(xì)介紹了Android自定義View之酷炫數(shù)字圓環(huán),實(shí)現(xiàn)效果很酷,,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-01-01
探究Android中ListView復(fù)用導(dǎo)致布局錯(cuò)亂的解決方案
這篇文章主要介紹了探究Android中ListView復(fù)用導(dǎo)致布局錯(cuò)亂的解決方案,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-10-10
Android之用PopupWindow實(shí)現(xiàn)彈出菜單的方法詳解
本篇文章是對(duì)在Android中,用PopupWindow實(shí)現(xiàn)彈出菜單的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
Android性能優(yōu)化之利用Rxlifecycle解決RxJava內(nèi)存泄漏詳解
RxJava作為一種響應(yīng)式編程框架,是目前編程界網(wǎng)紅,可謂是家喻戶曉,其簡潔的編碼風(fēng)格、易用易讀的鏈?zhǔn)椒椒ㄕ{(diào)用、強(qiáng)大的異步支持等使得RxJava被廣泛使用。2017-01-01
android 調(diào)用JNI SO動(dòng)態(tài)庫的方法
android 調(diào)用JNI 分為靜態(tài)調(diào)用與動(dòng)態(tài)調(diào)用,接下來通過本文給大家介紹android 調(diào)用JNI SO動(dòng)態(tài)庫的方法,感興趣的朋友一起看看吧2021-11-11
Android 中為什么要用Fragment.setArguments(Bundle bundle)來傳遞參數(shù)
這篇文章主要介紹了Android 中為什么要用Fragment.setArguments(Bundle bundle)來傳遞參數(shù),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下2017-01-01

