一個(gè)TextView設(shè)置多種格式(類似于“評(píng)論”的樣式)

如果本文幫助到你,本人不勝榮幸椎瘟,如果浪費(fèi)了你的時(shí)間覆致,本人深感抱歉。
希望用最簡單的大白話來幫助那些像我一樣的人肺蔚。如果有什么錯(cuò)誤煌妈,請(qǐng)一定指出,以免誤導(dǎo)大家宣羊、也誤導(dǎo)我璧诵。
本文來自:http://www.reibang.com/users/320f9e8f7fc9/latest_articles
感謝您的關(guān)注。

先看一張效果圖段只。
主要功能:
1.只有一個(gè) TextView腮猖,但是顯示多個(gè)樣式,并且赞枕,前幾個(gè)字是可以點(diǎn)擊澈缺。
2.修改 Toast 的彈出位置坪创。

這類效果,使用場(chǎng)景最多的姐赡,應(yīng)該就是評(píng)論了吧莱预。

主角介紹 - SpannableString

主要用的到就是 SpannableString 這個(gè)類,其實(shí)還有個(gè)SpannableStringBuilder项滑,他們兩個(gè)作用跟String其實(shí)是很像的依沮。不同之處就是他們倆可以給字符串設(shè)置各種樣式。
SpannableString 和 SpannableStringBuilder 的區(qū)別也就是字面意思枪狂,多了一個(gè)Builder危喉。類似于 String 和 StringBuilder。SpannableStringBuilder 是可以通過append()方法進(jìn)行拼接州疾。而SpannableString 通過構(gòu)造器創(chuàng)建了之后就固定辜限。

使用方法

String name = "小可愛:";
String msg = name + "小今天心情不錯(cuò),買張彩票严蓖。";

SpannableString ss = new SpannableString(msg);
ss.setSpan(new ForegroundColorSpan(Color.RED), name.length(), msg.length() - 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mTxt.setText(ss);

因?yàn)镾pannableString 實(shí)現(xiàn)了CharSequence的接口薄嫡,所以這一步之后,我們定義的 ss颗胡,就可以作為字符串設(shè)置給TextView了毫深。
顯示效果是:除了“小可愛:",后面的都是紅色字毒姨。
當(dāng)然哑蔫,我們是可以同時(shí)給一個(gè)字符串設(shè)置多個(gè)樣式的。

很明顯我們可以看到通過setSpan()這個(gè)方法手素,我們就將指定的字符更換了樣式鸳址。
我們具體來看看 setSpan(); 到底有多么的神通廣大。

/**
 * 設(shè)置字符串的樣式
 * @param what 對(duì)應(yīng)的樣式的類(往下看)
 * @param start 樣式開始的位置
 * @param end 樣式結(jié)束的位置
 * @param flags 包含的范圍(往下看)
 */
public void setSpan (Object what, int start, int end, int flags)

起始結(jié)束位置就不用說了泉懦,就是符合行業(yè)的標(biāo)準(zhǔn)模式稿黍,含頭不含尾。
這里需要介紹是第一個(gè)和第四個(gè)參數(shù)崩哩。
我們先來看第四個(gè):
int flags可設(shè)置為:

Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前后都不包括巡球,即在指定范圍的前面和后面插入新字符都不會(huì)應(yīng)用新樣式
Spannable.SPAN_EXCLUSIVE_INCLUSIVE:前面不包括,后面包括邓嘹。即僅在范圍字符的后面插入新字符時(shí)會(huì)應(yīng)用新樣式
Spannable.SPAN_INCLUSIVE_EXCLUSIVE:前面包括酣栈,后面不包括。
Spannable.SPAN_INCLUSIVE_INCLUSIVE:前后都包括汹押。

這里系統(tǒng)給定了四個(gè)參數(shù)矿筝,含義已經(jīng)注明。
需要說明的是棚贾,SpannableString 和 SpannableStringBuilder 的區(qū)別 在開頭提到了窖维,不知道大家還記得嗎榆综?
只有 SpannableStringBuilder 是可以通過append()方法,往后面拼接字符串的铸史,而這幾個(gè)標(biāo)示都是當(dāng)字符串改變之后的效果鼻疮,所以后面三個(gè)樣式的效果,可能只有使用了SpannableStringBuilder 添加文字的時(shí)候才看得到效果琳轿。
使用SpannableString 判沟,添加了其他的flags也是沒有什么用的,因?yàn)檎复郏灰惶鎿Q文字挪哄,整個(gè)對(duì)象全換了。
所以這個(gè)參數(shù)琉闪,我們看著用 就好中燥。

Object what 這個(gè)參數(shù),那可是相當(dāng)強(qiáng)大塘偎。先看功能

    1、BackgroundColorSpan 背景色
    2拿霉、ClickableSpan 文本可點(diǎn)擊吟秩,有點(diǎn)擊事件
    3、ForegroundColorSpan 文本顏色(前景色)
    4绽淘、MaskFilterSpan 修飾效果涵防,如模糊(BlurMaskFilter)、浮雕(EmbossMaskFilter)
    5沪铭、MetricAffectingSpan 父類壮池,一般不用
    6、RasterizerSpan 光柵效果
    7杀怠、StrikethroughSpan 刪除線(中劃線)
    8椰憋、SuggestionSpan 相當(dāng)于占位符
    9、UnderlineSpan 下劃線
    10赔退、AbsoluteSizeSpan 絕對(duì)大谐纫馈(文本字體)
    11、DynamicDrawableSpan 設(shè)置圖片硕旗,基于文本基線或底部對(duì)齊窗骑。
    12、ImageSpan 圖片
    13漆枚、RelativeSizeSpan 相對(duì)大写匆搿(文本字體)
    14、ReplacementSpan 父類墙基,一般不用
    15软族、ScaleXSpan 基于x軸縮放
    16刷喜、StyleSpan 字體樣式:粗體、斜體等
    17互订、SubscriptSpan 下標(biāo)(數(shù)學(xué)公式會(huì)用到)
    18吱肌、SuperscriptSpan 上標(biāo)(數(shù)學(xué)公式會(huì)用到)
    19、TextAppearanceSpan 文本外貌(包括字體仰禽、大小氮墨、樣式和顏色)
    20、TypefaceSpan 文本字體
    21吐葵、URLSpan 文本超鏈接

例如剛開始规揪,我們用到的:設(shè)置文本的顏色

SpannableString ss = new SpannableString(msg); 
ss.setSpan(new ForegroundColorSpan(Color.RED), name.length(), msg.length() - 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

上面的功能相當(dāng)?shù)亩啵灰灰唤榻B温峭,用的時(shí)候再看猛铅,因?yàn)橛梅ǘ疾畈欢唷?/p>


效果圖代碼實(shí)現(xiàn)

現(xiàn)在放上剛開始的時(shí)候,實(shí)現(xiàn)的那張圖代碼凤藏。因?yàn)榇a也相當(dāng)簡單奸忽,所以直接貼上。

public class MainActivity extends AppCompatActivity {

    private TextView mTxt;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTxt = (TextView) findViewById(R.id.txt);
        initView();
    }

    private void initView() {
        String name = "小可愛:";//模擬名稱
        String msg = name + "今天心情不錯(cuò)揖庄,買張彩票栗菜。";//模擬說說

        SpannableString ss = new SpannableString(msg);
        //名稱的點(diǎn)擊事件
        ss.setSpan(clickableSpan, 0, name.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        //說說的字體樣式
        ss.setSpan(new ForegroundColorSpan(Color.RED), name.length(), msg.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        mTxt.setText(ss);
        mTxt.setMovementMethod(LinkMovementMethod.getInstance());//設(shè)置超鏈接為可點(diǎn)擊狀態(tài)
    }

    /**
     * 名稱的點(diǎn)擊事件
     */
    private ClickableSpan clickableSpan = new ClickableSpan() {
        @Override
        public void updateDrawState(TextPaint ds) {
            super.updateDrawState(ds);
            ds.setUnderlineText(false); //去掉下劃線
            ds.setColor(Color.BLUE);//設(shè)置點(diǎn)擊前的顏色
        }

        @Override
        public void onClick(View widget) {
            toast(((TextView) widget).getText());
        }
    };

    private void toast(CharSequence str) {
        //如果這里加了 String.valueOf(str),彈出的提示蹄梢,就會(huì)沒有樣式
        Toast toast = Toast.makeText(MyApplication.getContext(), str, Toast.LENGTH_SHORT);
        toast.setGravity(Gravity.TOP, 0, 200);//改變Toast彈出的位置
        toast.show();
    }
}

在最后順便用到了修改Toast提示的位置疙筹。
坐標(biāo)可以根據(jù)屏幕的分辨率的尺寸的百分比來進(jìn)行計(jì)算,會(huì)更合理禁炒。

好了而咆,本次分享就到這里。
項(xiàng)目地址:
https://github.com/Wing-Li/PracticeDemos/tree/master/Hack10_CustomizeText

歡迎指正幕袱。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末暴备,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子凹蜂,更是在濱河造成了極大的恐慌馍驯,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玛痊,死亡現(xiàn)場(chǎng)離奇詭異汰瘫,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)擂煞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門混弥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事蝗拿×滥螅” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵哀托,是天一觀的道長惦辛。 經(jīng)常有香客問我,道長仓手,這世上最難降的妖魔是什么胖齐? 我笑而不...
    開封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮嗽冒,結(jié)果婚禮上呀伙,老公的妹妹穿的比我還像新娘。我一直安慰自己添坊,他們只是感情好剿另,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著贬蛙,像睡著了一般雨女。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上阳准,一...
    開封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天戚篙,我揣著相機(jī)與錄音,去河邊找鬼溺职。 笑死,一個(gè)胖子當(dāng)著我的面吹牛位喂,可吹牛的內(nèi)容都是我干的浪耘。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼塑崖,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼七冲!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起规婆,我...
    開封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤澜躺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后抒蚜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掘鄙,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年嗡髓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了操漠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡饿这,死狀恐怖浊伙,靈堂內(nèi)的尸體忽然破棺而出撞秋,到底是詐尸還是另有隱情,我是刑警寧澤嚣鄙,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布吻贿,位于F島的核電站,受9級(jí)特大地震影響哑子,放射性物質(zhì)發(fā)生泄漏舅列。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一赵抢、第九天 我趴在偏房一處隱蔽的房頂上張望剧蹂。 院中可真熱鬧,春花似錦烦却、人聲如沸宠叼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冒冬。三九已至,卻和暖如春摩渺,著一層夾襖步出監(jiān)牢的瞬間简烤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來泰國打工摇幻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留横侦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓绰姻,卻偏偏與公主長得像枉侧,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子狂芋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

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