TextView, 一個(gè)我們每天都會(huì)看到的控件捉撮,很簡(jiǎn)單怕品,它是用來顯示文字的。ok巾遭,那TextView的源碼我們可以點(diǎn)擊看一下肉康,足足有一萬(wàn)行,說明其實(shí)它做的事情很多的灼舍,遠(yuǎn)比我們想象的多吼和。
我們今天就聊一聊如何用TextView實(shí)現(xiàn)顯示各種奇奇怪怪的樣式,指定某些字加粗啊什么的骑素。
Span簡(jiǎn)介
對(duì)于Span炫乓,我的第一印象是html中的span標(biāo)簽,其被用來組合文檔中的行內(nèi)元素献丑。那么Android中的span呢末捣,其實(shí)與html中也一個(gè)意思,也是用來控制TextView的顯示的创橄。
Android 有其自己的Span 框架塔粒,涉及的類遵循一下四個(gè)定義規(guī)則:
- 如果一個(gè)Span影響字符層次上的文字格式,那么它繼承CharacterStyle類筐摘。
- 如果一個(gè)Span影響段落層次上的文字格式卒茬,那么它實(shí)現(xiàn)ParagraphStyle接口船老。
- 如果一個(gè)Span修改字符層次上的文字外觀,那么它實(shí)現(xiàn)UpdateAppearance接口圃酵。
- 如果一個(gè)Span修改字符層次上的度量或者尺寸柳畔,那么它實(shí)現(xiàn)UpdateLayout接口。
我們自定義Span時(shí)并不需要直接繼承或者實(shí)現(xiàn)這些類或者接口郭赐,而是實(shí)現(xiàn)其他更加具體的類薪韩。
Span類介紹
BulletSpan
BulletSpan影響段落層次文字的格式,它讓你在段落開頭添加一個(gè)黑圓點(diǎn)捌锭。
BulletSpan span = new BulletSpan(15, Color.RED);
SpannableString spannableString = new SpannableString(TEXT);
spannableString.setSpan(span, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
mTextView1.setText(spannableString);
QuoteSpan
QuoteSpan影響段落層次文字的格式俘陷,它可以在段落前邊添加一個(gè)豎直的引用線。
QuoteSpan span = new QuoteSpan(Color.RED);
SpannableString spannableString = new SpannableString(TEXT);
spannableString.setSpan(span, 0, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
mTextView2.setText(spannableString);
AlignmentSpan
AlignSpan.Standard影響段落層次文字的格式观谦,它允許你控制段落的對(duì)齊方式拉盾,有居中對(duì)齊,右側(cè)對(duì)齊和左側(cè)對(duì)齊豁状。
AlignmentSpan.Standard span = new AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER);
SpannableString spannableString = new SpannableString(TEXT);
spannableString.setSpan(span, 0, 0, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
mTextView3.setText(spannableString);
UnderlineSpan
UnderlineSpan影響字符層次文字的格式捉偏,它可以在文字下方添加下劃線。其內(nèi)部實(shí)現(xiàn)其實(shí)就是使用Paint.setUnderlineText(true)實(shí)現(xiàn)的泻红。
UnderlineSpan span = new UnderlineSpan();
SpannableString spannableString = new SpannableString(TEXT);
spannableString.setSpan(span, 0, spannableString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
mTextView4.setText(spannableString);
StrikethroughSpan
StrikethroughSpan影響字符層次上的文字的格式夭禽,它允許你在文字上添加刪除線。它內(nèi)部使用Paint.setStrikeThruText(true))來實(shí)現(xiàn)谊路。
StrikethroughSpan span = new StrikethroughSpan();
SpannableString spannableString = new SpannableString(TEXT);
spannableString.setSpan(span, 0, spannableString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
mTextView5.setText(spannableString);
SubscriptSpan
SubscriptSpan影響字符層次上的文字的格式讹躯,它允許你把文字作為下標(biāo)進(jìn)行顯示。
SubscriptSpan span = new SubscriptSpan();
SpannableString spannableString = new SpannableString(TEXT);
spannableString.setSpan(span, 0, spannableString.length() / 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
mTextView6.setText(spannableString);
SuperscriptSpan
影響字符層次上的文字的格式缠劝,它允許你把文字作為上標(biāo)進(jìn)行顯示潮梯。
SuperscriptSpan span = new SuperscriptSpan();
SpannableString spannableString = new SpannableString(CONTENT);
spannableString.setSpan(span,0,spannableString.length()/2,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
mTvTextView.setText(spannableString);
BackgroundColorSpan
BackgroundColorSpan影響字符層次上的文字的格式,你可以使用它設(shè)置文字的背景顏色剩彬。
BackgroundColorSpan span = new BackgroundColorSpan(Color.RED);
SpannableString spannableString = new SpannableString(TEXT);
spannableString.setSpan(span, 0, spannableString.length() / 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
mTextView7.setText(spannableString);
ForegroundColorSpan
ForegroundColorSpan影響字符層次上的文字的格式酷麦,你可以使用它設(shè)置文字的自己的顏色矿卑。
ForegroundColorSpan span = new ForegroundColorSpan(Color.RED);
SpannableString spannableString = new SpannableString(TEXT);
spannableString.setSpan(span, 0, spannableString.length() / 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
mTextView8.setText(spannableString);
StyleSpan
StyleSpan影響字符層次上的文字的格式喉恋。它允許你設(shè)置文字的類型(bold, italic, normal)
StyleSpan span = new StyleSpan(Typeface.BOLD);
SpannableString spannableString = new SpannableString(TEXT);
spannableString.setSpan(span, 0, spannableString.length() / 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
mTextView9.setText(spannableString);
TypefaceSpan
TypefaceSpan影響字符層次上的文字的格式。它允許你設(shè)置文字的字體族(monospace, serif等)
TypefaceSpan span = new TypefaceSpan("serif");
SpannableString spannableString = new SpannableString(TEXT);
spannableString.setSpan(span, 0, spannableString.length() / 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
mTextView10.setText(spannableString);
AbsoluteSizeSpan
AbsoluteSizeSpan影響字符層次上的文字的格式母廷。它允許你設(shè)置文字的絕對(duì)字體大小轻黑。
AbsoluteSizeSpan span = new AbsoluteSizeSpan(24, true);
SpannableString spannableString = new SpannableString(TEXT);
spannableString.setSpan(span, 0, spannableString.length() / 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
mTextView11.setText(spannableString);
RelativeSizeSpan
RelativeSizeSpan影響字符層次上的文字的格式。它允許你設(shè)置文字的相對(duì)字體大小琴昆。
RelativeSizeSpan span = new RelativeSizeSpan(2.0f);
SpannableString spannableString = new SpannableString(TEXT);
spannableString.setSpan(span, 0, spannableString.length() / 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
mTextView11.setText(spannableString);
ScaleXSpan
?ScaleXSpan`影響字符層次上的文字的格式氓鄙。它讓你讓文字在x方向上進(jìn)行縮放。
ScaleXSpan span = new ScaleXSpan(2.0f);
SpannableString spannableString = new SpannableString(TEXT);
spannableString.setSpan(span, 0, spannableString.length() / 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
mTextView12.setText(spannableString);
寄語(yǔ)
寫的匆忙业舍,后續(xù)繼續(xù)補(bǔ)充
謝謝大家閱讀抖拦,如有幫助升酣,來個(gè)喜歡或者關(guān)注吧!
本文作者:Anderson/Jerey_Jobs
博客地址 : 夏敏的博客/Anderson大碼渣/Jerey_Jobs
簡(jiǎn)書地址 : Anderson大碼渣
CSDN地址 : Jerey_Jobs的專欄
github地址 : Jerey_Jobs