基于TextView 實現(xiàn)標(biāo)簽化TextLabel及圖文混排

TextView 是我們最常用的View,經(jīng)常使用它進(jìn)行顯示文字嘁傀,但使用TextView來顯示圖片變顯的不那么方便了,為此我們需要實現(xiàn)可用于處理要需要格式化TextView赌蔑、可設(shè)置圖片、文字的顏色然走,尺寸弥鹦,及可點擊的事件迄本、簡單的圖文混排的TextView.

效果圖

格式化需求

開發(fā)中常要使用文字組合來填充TextView,如金額:100元而經(jīng)常變動的是TextView100數(shù)字這部分文字胚委,并非全部的文字挟鸠。這種場景下,標(biāo)簽化TextView十分必要亩冬。在沒引入標(biāo)簽化之前對于這種需求我們需要格式化字串然后設(shè)置到TextView中艘希。

//xml中的TextView
<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />
//設(shè)置文字
setText(String.format("金額:%1$S元","100"))

經(jīng)常寫格式化這部分代碼,不適合聰明(懶惰)的你的設(shè)定硅急,于是我們可以把格式這部分代碼固定到TextView的xml中覆享,然后實現(xiàn)setTextFormat()方法使用xml中的format字段去格式化字符再設(shè)置到TextView中,如下:

//xml中的標(biāo)簽化的TextView
<cn.ymex.view.label.TextLabel
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:format="金額:%1$s元" />
    
//設(shè)置文字
setTextFormat("100")

標(biāo)簽固定化

這里我們通過標(biāo)簽化基本上可以解決一部分這種需要求营袜,但產(chǎn)品經(jīng)理說我覺得這應(yīng)該在金額后面加上個vip圖標(biāo)(金額: 假裝vip圖標(biāo) 100元
如果要實現(xiàn)這種加圖標(biāo)的需求撒顿,至少我們會在再增加一個TextView 到布局中,格式化的文字也要更改荚板。像這樣:

//xml 增加vip圖標(biāo)
<LinearLayout
    android:layout_width="wrap_content"
    android:orientation="horizontal"
    android:layout_height="wrap_content">
    <TextView
        android:layout_width="wrap_content"
        android:text="金額"
        android:drawableRight="@mipmap/ic_vip"
        android:layout_height="wrap_content"/>
    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>

//格式化文字改變凤壁。
textView.setText(String.format(":%1$s元"),"100)

小小的需求,我們至少要變動兩個地方的代碼,我的需求屏蔽這種變動跪另,我們知道TextView 其實可以用SpannableStringImageSpan設(shè)置圖文的客扎。我們可以嘗試封裝一個固定的頭和尾部到TextView中,通過頭部與尾部和中間文字的組合來屏蔽這種變動罚斗,于是我們可像下面這樣寫代碼徙鱼。

//xml中的標(biāo)簽化的TextView
<cn.ymex.view.label.TextLabel
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="100"
    app:startDrawable="@mipmap/ic_vip"
    app:startDrawableInLast="true"
    app:startDrawableSize="24dp"
    app:endText="元"
    app:startText=" 金額:" />
    
//設(shè)置文字
setText("100")

SpanCell與文字事件

我們偶爾會遇到那種部分文字改變顏色和部分文字可點擊。對于這種需求我們經(jīng)常是通過textView組合或使用設(shè)置html代碼來實現(xiàn)。


通過上面的種種對于文字與圖片需求袱吆,歸根是一種對于圖文和文字排序的問題厌衙,是的,表象下隱藏的東西就這么明顯绞绒。圖片文字組合變化不外乎兩種婶希,圖片在前文字在后 或文字在前圖片在后。 于我們把圖片和文字放在一塊蓬衡,這就是SpanCell喻杈。SpaaCell由一個文字單元和一個圖片單元組成。一個圖片單元只能放一張圖片狰晚,文字單元實現(xiàn)了對文字設(shè)置顏色筒饰,大小,事件等壁晒。

所以對于文字點擊的需求變的再簡單不過瓷们。

 SpanCell spanCell = SpanCell.build()
                        .textColor(Color.parseColor("#887acc"))
                        .text("《用戶協(xié)議》");

spanCell.setClickableSpan(new SpanCell.OnClickListener() {
    @Override
    public void onClick(View view, SpanCell spanCell) {
        //... 事件處理
    }
});

textLabel.setText(spanCell);

TextView使用Spancell

普通的TextView 是可以使用Spancell 的,但注意的是如果 是ListView中的TextView使用Spancell,會有事件沖突的問題(使用TextLabel代替就能解決)秒咐。

 SpanCell spanCell = SpanCell.build()
                        .textColor(Color.parseColor("#887acc"))
                        .text("《用戶協(xié)議》");

spanCell.setClickableSpan(new SpanCell.OnClickListener() {
    @Override
    public void onClick(View view, SpanCell spanCell) {
        //... 事件處理
    }
});
//textview 設(shè)置 spanCell
textView.setText(spanCell.getSpannable());

圖文混排

有SpanCell,我們只要組合多個SpanCell谬晕,那么這可實現(xiàn)基于的混排效果。

ImageSpannable forgimg = new ImageSpannable(context, R.mipmap.frog);
SpanCell span1 = SpanCell.build()
        .text("一只小青蛙")
        .imageSpanInLast(true)
        .imageSpan(forgimg);

ImageSpannable deerimg = new ImageSpannable(context, R.mipmap.deer);
SpanCell span2 = SpanCell.build()
        .text(",發(fā)現(xiàn)了一只受傷的小鹿")
        .imageSpan(deerimg)
        .imageSpanInLast(true);

ImageSpannable hippoimg = new ImageSpannable(context, R.mipmap.hippo, ImageSpannable.ALIGN_FONTCENTER);
hippoimg.setSize(64,64);
SpanCell span3 = SpanCell.build()
        .text("于是它去尋求小牛")
        .imageSpanInLast(true)
        .imageSpan(hippoimg);

ImageSpannable owlimg = new ImageSpannable(context, R.mipmap.owl, ImageSpannable.ALIGN_FONTCENTER);
owlimg.setSize(160, 160);
SpanCell span4 = SpanCell.build()
        .imageSpanInLast(true).
        text("的幫助携取。小牛說攒钳,不幫不幫就不幫。雷滋。于是小青蛙又去向其他 動物尋求幫助不撑。于是它找到了貓頭鷹").imageSpan(owlimg);

SpanCell span5 = SpanCell.build()
        .text(",于是他們一起愉快的喝可樂 !呵呵");

textLabel.setText(span1,span2,span3,span4,span5);

總結(jié):
TextLabel 雖然實現(xiàn)能應(yīng)對圖文排序的變化惊豺,但還是保留了一個固定的頭片段(spancell)和一個尾片段及其他便利的特性燎孟。這樣做的目的是方便有固定化標(biāo)簽、格式化的場景尸昧。這些設(shè)計都是無痛的揩页,只要你愿意,完全可使用TextLabel代替TextView烹俗。

GitHub源碼地址:github.com/ymex/textlabel

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末爆侣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子幢妄,更是在濱河造成了極大的恐慌兔仰,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蕉鸳,死亡現(xiàn)場離奇詭異乎赴,居然都是意外死亡忍法,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門榕吼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饿序,“玉大人,你說我怎么就攤上這事羹蚣≡剑” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵顽素,是天一觀的道長咽弦。 經(jīng)常有香客問我,道長胁出,這世上最難降的妖魔是什么型型? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮划鸽,結(jié)果婚禮上输莺,老公的妹妹穿的比我還像新娘戚哎。我一直安慰自己裸诽,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布型凳。 她就那樣靜靜地躺著丈冬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪甘畅。 梳的紋絲不亂的頭發(fā)上埂蕊,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機與錄音疏唾,去河邊找鬼蓄氧。 笑死,一個胖子當(dāng)著我的面吹牛槐脏,可吹牛的內(nèi)容都是我干的喉童。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼顿天,長吁一口氣:“原來是場噩夢啊……” “哼堂氯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起牌废,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤咽白,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鸟缕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晶框,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了授段。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畜埋。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖畴蒲,靈堂內(nèi)的尸體忽然破棺而出悠鞍,到底是詐尸還是另有隱情,我是刑警寧澤模燥,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布咖祭,位于F島的核電站,受9級特大地震影響蔫骂,放射性物質(zhì)發(fā)生泄漏么翰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一辽旋、第九天 我趴在偏房一處隱蔽的房頂上張望浩嫌。 院中可真熱鬧,春花似錦补胚、人聲如沸码耐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽骚腥。三九已至,卻和暖如春瓶逃,著一層夾襖步出監(jiān)牢的瞬間束铭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工厢绝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留契沫,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓昔汉,卻偏偏與公主長得像懈万,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子挤庇,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,842評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫钞速、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,066評論 4 62
  • Text Kit學(xué)習(xí)(入門和進(jìn)階): http://www.cocoachina.com/industry/201...
    F麥子閱讀 4,009評論 1 13
  • 是不是痛過了才能成長嫡秕,是不是分手了就不要回憶 渴语,天再藍(lán)有你才是晴天。
    北緯91度閱讀 149評論 0 0
  • (1) 幾個星期前昆咽,我們送別公派留美的老魏驾凶,離別的場景勾出了我們眼中的幾滴眼淚牙甫,喜悅之后,更多是對自己的感慨调违。猶記...
    馮小風(fēng)閱讀 8,926評論 10 77