Android實戰(zhàn)SpannableString多行圖文混排的應用

首先我們來看下這張效果圖娃磺,注意圖片中置頂這個圖片是如何實現(xiàn)的呢亡哄?當然你也可也設置他的點擊事件,比如帶有視頻或者其他類的枣抱,這里我們就不多做介紹了熔吗,看項目具體需求就好。

效果一
效果二

如果就涉及到一行的話我們只需要在文本后面加個imageview就行沃但,但是如果多行顯示的話這樣做就不太好了

那么什么是SpannableString呢磁滚?

SpannableString其實和String一樣,都是一種字符串類型宵晚,同樣TextView也可以直接設置SpannableString作為顯示文本垂攘,不同的是SpannableString可以通過使用其方法setSpan方法實現(xiàn)字符串各種形式風格的顯示,重要的是可以指定設置的區(qū)間,也就是為字符串指定下標區(qū)間內的子字符串設置格式淤刃。

setSpan(Object what, int start, int end, int flags)方法需要用戶輸入四個參數(shù)晒他,what表示設置的格式是什么,可以是前景色逸贾、背景色也可以是可點擊的文本等等陨仅,start表示需要設置格式的子字符串的起始下標津滞,同理end表示末尾下標,flags就是一種標識灼伤,共有以下四種屬性:

Spanned.SPAN_INCLUSIVE_EXCLUSIVE 從起始下標到末尾下標触徐,包括起始下標,不包括后面
Spanned.SPAN_INCLUSIVE_INCLUSIVE 從起始下標到末尾下標狐赡,同時包括起始下標和末尾下標撞鹉,前后包括
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE 從起始下標到末尾下標,但都不包括起始下標和末尾下標
Spanned.SPAN_EXCLUSIVE_INCLUSIVE 從起始下標到末尾下標颖侄,包括末尾下標

到此鸟雏,那我們看看如何在代碼中實現(xiàn)這效果一呢?

String title = MapUtil.getValueStr(datas.get(position), "Title");
            try {
                title = java.net.URLDecoder.decode(title, "utf-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            //圖文混排
            Drawable drawable = getResources().getDrawable(R.mipmap.icon_top);
            drawable.setBounds(0,0,drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());//這里后兩位不要填寫int類參數(shù)览祖,否則會出現(xiàn)在大屏手機上顯示不整齊的情況
            ImageSpan is = new ImageSpan(drawable);
            String space = " ";
            title = title + space;
            int strLength = title.length();
            SpannableString ss = new SpannableString(title);
            ss .setSpan(is,strLength-1, strLength, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

            if ("1".equals(TopFlag)) { //置頂顯示
                viewHolder.title.setText(ss.subSequence(0,strLength));
            } else {
                viewHolder.title.setText(title);
            }

我們拿到接口返回的title后孝鹊,把我們需要的圖片通過 Drawable drawable = getResources().getDrawable(R.mipmap.icon_top);
drawable.setBounds(0,0,drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());//這里后兩位不要填寫int類參數(shù),否則會出現(xiàn)在大屏手機上顯示不整齊的情況

拿到圖片后設置你想要的大小和位置即可輕松快速實現(xiàn)這一效果展蒂。

那么怎么實現(xiàn)效果2那種name和內容顏色區(qū)分開呢又活?有人會覺得,這不name寫個布局锰悼,內容寫個布局就ok了嗎皇钞?是的這樣寫沒錯能夠實現(xiàn)這個效果,但是松捉,你注意到這種評論文本他是一行結束跳轉開頭繼續(xù)顯示的,你那樣做的話肯定不行了馆里,只能夠集中顯示不會到開頭

好了分析完了我們具體看看如何輕松實現(xiàn)這一效果吧隘世!

` /**
*
*
* @author 創(chuàng)建人: kris_liutao
*
* @description 功能描述: 利用SpannableString將不同的文本類型拼接起來ForegroundColorSpan只能使用int類型參數(shù)
*
*/

            String name = (MapUtil.getValueStr(datas.get(position), "Name"));
            String resourName = (MapUtil.getValueStr(datas.get(position), "ReceiverName"));
            String msg = name +" 回復 "+resourName+" :"+ content;

            int fstart=msg.indexOf(name);
            int fend=fstart+name.length();

            int bstart=msg.indexOf(resourName);
            int bend=bstart+resourName.length();
            SpannableString spannableString = new SpannableString(msg);
            spannableString.setSpan(new ForegroundColorSpan(Color.parseColor("#21D04B") ),fstart,fend, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
            spannableString.setSpan(new ForegroundColorSpan(Color.parseColor("#21D04B") ),bstart,bend, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);

            holder.content.setText(spannableString);

`

注意看代碼部分
String name = (MapUtil.getValueStr(datas.get(position), "Name"));

String resourName = (MapUtil.getValueStr(datas.get(position), "ReceiverName"));

String content = MapUtil.getValueStr(datas.get(position), "Content");

這是我們接口返回的名字和內容,我們只需要設置名字的顏色的話那么通過
String resourName = (MapUtil.getValueStr(datas.get(position), "ReceiverName"));
String msg = name +" 回復 "+resourName+" :"+ content;

            int fstart=msg.indexOf(name);
            int fend=fstart+name.length();

拼接將name取出來鸠踪,得到name的length()丙者,然后通過SpannableString創(chuàng)建新的對象
SpannableString spannableString = new SpannableString(msg);
spannableString.setSpan(new ForegroundColorSpan(Color.parseColor("#21D04B") ),fstart,fend, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);

ForegroundColorSpan這個設置的是字體的顏色,BackgroundColorSpan這個參數(shù)是選中內容設置背景顏色等等营密,最后holder.content.setText(spannableString);將SpannableString的對象設置到你想要的地方即可實現(xiàn)這一效果械媒。

CSDN移步:
CSDN http://blog.csdn.net/first_cooman

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市评汰,隨后出現(xiàn)的幾起案子纷捞,更是在濱河造成了極大的恐慌,老刑警劉巖被去,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件主儡,死亡現(xiàn)場離奇詭異,居然都是意外死亡惨缆,警方通過查閱死者的電腦和手機糜值,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門丰捷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人寂汇,你說我怎么就攤上這事病往。” “怎么了骄瓣?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵停巷,是天一觀的道長。 經(jīng)常有香客問我累贤,道長叠穆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任臼膏,我火速辦了婚禮硼被,結果婚禮上,老公的妹妹穿的比我還像新娘渗磅。我一直安慰自己嚷硫,他們只是感情好,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布始鱼。 她就那樣靜靜地躺著仔掸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪医清。 梳的紋絲不亂的頭發(fā)上起暮,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機與錄音会烙,去河邊找鬼负懦。 笑死,一個胖子當著我的面吹牛柏腻,可吹牛的內容都是我干的辫红。 我是一名探鬼主播咒程,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼谬擦,長吁一口氣:“原來是場噩夢啊……” “哼袖牙!你這毒婦竟也來了?” 一聲冷哼從身側響起沃缘,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤躯枢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后槐臀,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體闺金,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年峰档,在試婚紗的時候發(fā)現(xiàn)自己被綠了败匹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寨昙。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖掀亩,靈堂內的尸體忽然破棺而出舔哪,到底是詐尸還是另有隱情,我是刑警寧澤槽棍,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布捉蚤,位于F島的核電站,受9級特大地震影響炼七,放射性物質發(fā)生泄漏缆巧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一豌拙、第九天 我趴在偏房一處隱蔽的房頂上張望陕悬。 院中可真熱鬧,春花似錦按傅、人聲如沸捉超。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拼岳。三九已至,卻和暖如春况芒,著一層夾襖步出監(jiān)牢的瞬間惜纸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工绝骚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留堪簿,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓皮壁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親哪审。 傳聞我的和親對象是個殘疾皇子蛾魄,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345