Whoops,兄臺(tái)的TextView怎么功能如此強(qiáng)大做粤?

TextView, 一個(gè)我們每天都會(huì)看到的控件捉撮,很簡(jiǎn)單怕品,它是用來顯示文字的。ok巾遭,那TextView的源碼我們可以點(diǎn)擊看一下肉康,足足有一萬(wàn)行,說明其實(shí)它做的事情很多的灼舍,遠(yuǎn)比我們想象的多吼和。

我們今天就聊一聊如何用TextView實(shí)現(xiàn)顯示各種奇奇怪怪的樣式,指定某些字加粗啊什么的骑素。

demo 效果

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);
BulletSpan.png

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);
Paste_Image.png

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);
AlignmentSpan

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);
UnderlineSpan

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);
StrikethroughSpan

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);
SubscriptSpan.png

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);
SuperscriptSpan.png

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);
BackgroundColorSpan

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);
Paste_Image.png

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);
StyleSpan.png

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);
TypefaceSpan.png

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);
AbsoluteSizeSpan.png

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);
RelativeSizeSpan.png

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);
ScaleXSpan

寄語(yǔ)

寫的匆忙业舍,后續(xù)繼續(xù)補(bǔ)充


謝謝大家閱讀抖拦,如有幫助升酣,來個(gè)喜歡或者關(guān)注吧!


本文作者:Anderson/Jerey_Jobs

博客地址 : 夏敏的博客/Anderson大碼渣/Jerey_Jobs

簡(jiǎn)書地址 : Anderson大碼渣

CSDN地址 : Jerey_Jobs的專欄

github地址 : Jerey_Jobs

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末态罪,一起剝皮案震驚了整個(gè)濱河市噩茄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌复颈,老刑警劉巖绩聘,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異耗啦,居然都是意外死亡凿菩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門帜讲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衅谷,“玉大人,你說我怎么就攤上這事舒帮』岷龋” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵玩郊,是天一觀的道長(zhǎng)肢执。 經(jīng)常有香客問我,道長(zhǎng)译红,這世上最難降的妖魔是什么预茄? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮侦厚,結(jié)果婚禮上耻陕,老公的妹妹穿的比我還像新娘。我一直安慰自己刨沦,他們只是感情好诗宣,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著想诅,像睡著了一般召庞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上来破,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天篮灼,我揣著相機(jī)與錄音,去河邊找鬼徘禁。 笑死诅诱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的送朱。 我是一名探鬼主播娘荡,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼干旁,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了炮沐?” 一聲冷哼從身側(cè)響起疤孕,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎央拖,沒想到半個(gè)月后祭阀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鲜戒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年专控,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遏餐。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡伦腐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出失都,到底是詐尸還是另有隱情柏蘑,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布粹庞,位于F島的核電站咳焚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏庞溜。R本人自食惡果不足惜革半,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望流码。 院中可真熱鬧又官,春花似錦、人聲如沸漫试。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)驾荣。三九已至外构,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間秘车,已是汗流浹背典勇。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工劫哼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留叮趴,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓权烧,卻偏偏與公主長(zhǎng)得像眯亦,于是被迫代替她去往敵國(guó)和親伤溉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理妻率,服務(wù)發(fā)現(xiàn)乱顾,斷路器,智...
    卡卡羅2017閱讀 134,601評(píng)論 18 139
  • 注:本翻譯使用符號(hào)「」來突出某些可能會(huì)產(chǎn)生歧義的名詞宫静。目前狀態(tài):勘誤中走净。 Unicode?標(biāo)準(zhǔn)附錄#9 UNICO...
    Eriice閱讀 2,010評(píng)論 0 1
  • ?前幾天在微博上看到一個(gè)人評(píng)論Android Span機(jī)制相當(dāng)強(qiáng)大,有必要細(xì)心研究一下孤里,于是就google了一下伏伯,...
    程序員歷小冰閱讀 3,444評(píng)論 4 55
  • 本周輸出兩個(gè)板塊內(nèi)容: 一、偏見(What——Why——How) 二捌袜、評(píng)價(jià)證據(jù)(要素说搅、方法) 因此,評(píng)價(jià)一個(gè)觀點(diǎn)或...
    梁夢(mèng)婷閱讀 175評(píng)論 0 1
  • R 閱讀原文 衡量你的學(xué)習(xí)是否有效的重要標(biāo)準(zhǔn)是:學(xué)習(xí)之后虏等,你解決問題的思路和方法是否得到了改變弄唧。我會(huì)刻意放慢速度...
    西貝悠哉閱讀 423評(píng)論 0 0