Android使用Span打造豐富多彩的文本詳解
1.引言
在開(kāi)發(fā)過(guò)程中經(jīng)常需要使用文本,有時(shí)候需要對(duì)一段文字中的部分文字進(jìn)行特殊的處理,如改變其中部分文字的大小、顏色、加下劃線等,這個(gè)時(shí)候使用Span就能方便地解決這些問(wèn)題。本文將主要介紹SpannableStringBuilder和各種Span的使用。
2.SpannableStringBuilder的基本用法
新建一個(gè)SpannableStringBuilder對(duì)象的操作如下:
SpannableStringBuilder builder = new SpannableStringBuilder("Hello World!");
SpannableStringBuilder的setSpan()方法如下:
//what:各種文本Span,如BackgroundColorSpan、ForegroundColorSpan等 //start:應(yīng)用Span的文本的開(kāi)始位置索引 //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用來(lái)改變文本的絕對(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用來(lái)改變文本的背景顏色大小,示例如下:
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用來(lái)給文本添加點(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用來(lái)給段落添加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可以用來(lái)改變文本的顏色,示例如下:
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可以在文本開(kāi)始的地方添加位圖,而且可以在位圖和文本之間設(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可以在文本開(kāi)始的地方添加一個(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)文章
XListView實(shí)現(xiàn)網(wǎng)絡(luò)加載圖片和下拉刷新
這篇文章主要為大家詳細(xì)介紹了XListView實(shí)現(xiàn)網(wǎng)絡(luò)加載圖片和下拉刷新,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11Android 繪制多級(jí)樹(shù)形選擇列表實(shí)例代碼
這篇文章主要介紹了Android 繪制多級(jí)樹(shù)形選擇列表的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-02-02flutter?Bloc?add兩次只響應(yīng)一次問(wèn)題解析
這篇文章主要為大家介紹了flutter?Bloc?add兩次只響應(yīng)一次問(wèn)題解析記錄,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11Android高級(jí)界面組件之拖動(dòng)條和評(píng)星條的功能實(shí)現(xiàn)
這篇文章主要介紹了Android高級(jí)界面組件之拖動(dòng)條和評(píng)星條的實(shí)現(xiàn)實(shí)例,需要的的朋友參考下2017-03-03Flutter中如何實(shí)現(xiàn)無(wú)Context跳轉(zhuǎn)詳解
這篇文章主要給大家介紹了關(guān)于Flutter中如何實(shí)現(xiàn)無(wú)Context跳轉(zhuǎn)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Flutter具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09Flutter實(shí)現(xiàn)密碼強(qiáng)度校驗(yàn)結(jié)果的示例詳解
我們經(jīng)常在一些網(wǎng)站上看到這樣的密碼強(qiáng)度指示,使用三段線,分別用不同的顏色來(lái)表示弱密碼、中等強(qiáng)度密碼和強(qiáng)密碼,本篇我們就用?Flutter?來(lái)實(shí)現(xiàn)這樣一個(gè)密碼強(qiáng)度校驗(yàn)示例,希望對(duì)大家有所幫助2023-08-08使用AccessibilityService實(shí)現(xiàn)自動(dòng)遍歷點(diǎn)贊功能
這篇文章主要為大家詳細(xì)介紹了使用AccessibilityService實(shí)現(xiàn)自動(dòng)遍歷點(diǎn)贊功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12Android JNI處理圖片實(shí)現(xiàn)黑白濾鏡的方法
這篇文章主要介紹了Android JNI處理圖片實(shí)現(xiàn)黑白濾鏡的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01自定義View系列之kotlin繪制手勢(shì)設(shè)置溫度控件的方法
這篇文章主要給大家介紹了關(guān)于自定義View系列之kotlin繪制手勢(shì)設(shè)置溫度控件的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07