Android之SpannableString、SpannableStringBuilder總結

SpannableString

String字符串盆繁,這個咱們經常用掀淘,一定很熟悉,而這個SpanableString這個就不常用了油昂,其實它們都可以表示字符串革娄,只不過后者可以輕松地利用官方提供的Api對字符串進行各種風格的設置。

日常開發(fā)中都有哪些應用場景呢冕碟?比如:

  • 顯示的文字加上下劃線拦惋、中劃線、斜體安寺、加粗等
  • 給TextView中部分文字加上點擊事件或顏色背景
  • TextView中部分文字需要顯示的字體大厕妖,部分文字需要顯示的字體小
  • TextView中的文字可要求顯示表情符號(在聊天應用中經常會出現)等等等

這點需求雖說實現起來不是什么難事,不過選擇一個好的方案挑庶,可以事半功倍言秸。接下來介紹今天的主角:SpannableString

先看看官方怎么定義這個類的

This is the class for text whose content is immutable but to which markup objects can be attached and detached. For mutable text, see SpannableStringBuilder.

大體意思是:這是文本的類,該文本的內容是不可變的挠羔,但可以附加和分離標記對象井仰。對于可變文本,請參見SpannableStringBuilder破加。

這個類源碼很少俱恶,100行代碼都不到,感興趣的可以去看看范舀。其中有一個核心方法:setSpan(what,start,end,flags)共有4個參數

  1. what:是一個Object對象合是,用來設置字符串的顯示風格(其中官方已經給我們提供一些常用的Span類,當然也可以自己定義了)
  2. sart:從字符串的第幾位開始锭环,設置的風格起作用
  3. end:設置的風格到第幾位后聪全,不在起作用;其實與start構成了一個作用區(qū)間
  4. flags:有四種形式辅辩,就是確定作用空間是否包括收尾难礼,待會說

常用的Span類有:

  1. BackgroundColorSpan 背景色
  2. ClickableSpan 文本可點擊,有點擊事件
  3. ForegroundColorSpan 文本顏色(前景色)
  4. MaskFilterSpan 修飾效果玫锋,如模糊(BlurMaskFilter)蛾茉、浮雕(EmbossMaskFilter)
  5. MetricAffectingSpan 父類,一般不用
  6. RasterizerSpan 光柵效果
  7. StrikethroughSpan 刪除線(中劃線)
  8. SuggestionSpan 相當于占位符
  9. UnderlineSpan 下劃線
  10. AbsoluteSizeSpan 絕對大辛寐埂(文本字體)
  11. DynamicDrawableSpan 設置圖片谦炬,基于文本基線或底部對齊。
  12. ImageSpan 圖片
  13. RelativeSizeSpan 相對大小(文本字體)
  14. ReplacementSpan 父類键思,一般不用
  15. ScaleXSpan 基于x軸縮放
  16. StyleSpan 字體樣式:粗體础爬、斜體等
  17. SubscriptSpan 下標(數學公式會用到)
  18. SuperscriptSpan 上標(數學公式會用到)
  19. TextAppearanceSpan 文本外貌(包括字體、大小吼鳞、樣式和顏色)
  20. TypefaceSpan 文本字體
  21. URLSpan 文本超鏈接

flags共有四種屬性:

  1. Spanned.SPAN_INCLUSIVE_EXCLUSIVE 從起始下標到終了下標看蚜,包括起始下標
  2. Spanned.SPAN_INCLUSIVE_INCLUSIVE從起始下標到終了下標,同時包括起始下標和終了下標
  3. Spanned.SPAN_EXCLUSIVE_EXCLUSIVE從起始下標到終了下標赖条,但都不包括起始下標和終了下標
  4. Spanned.SPAN_EXCLUSIVE_INCLUSIVE 從起始下標到終了下標失乾,包括終了下標

事例

  • ForegroundColorSpan :給一段文字中個別的字設置顏色,這個比較常用了


    圖1

    ForegroundColorSpan纬乍,為文本設置前景色碱茁,效果和TextView的setTextColor()類似,不過如果用setTextColor()估計得用TextView拼接或者用到Html類加載html片段實現仿贬。ForegroundColorSpan纽竣,實現如下:

        TextView txtInfo = findViewById(R.id.textView);
        SpannableString span = new SpannableString("設置前背景色");
        span.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.colorPrimary)),3, 5, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
        txtInfo.setMovementMethod(LinkMovementMethod.getInstance());
        txtInfo.setHighlightColor(getResources().getColor(android.R.color.transparent));
        txtInfo.setText(span);
  • ImageSpan:在文字中顯示表情符號(其實就是設置圖片)


    圖2

    如果對一段文字中特殊文字進行處理,就可以實現聊天效果中帶有表情符茧泪。
    怎么實現呢蜓氨,代碼如下,其實我們知道有這個用法就行了

        TextView tv8 = findViewById(R.id.tv8);
        SpannableString spanStr8 = new SpannableString("文字里添加表情(表情)");
        Drawable image = getResources().getDrawable(R.mipmap.ic_launcher);
        image.setBounds(new Rect(0,0,50,50));
        spanStr8.setSpan(new ImageSpan(image),5, 7,Spanned.SPAN_INCLUSIVE_INCLUSIVE);
        tv8.setText(spanStr8);
  • ClickableSpan:可以為文字加上點擊事件队伟,比如常見的:


    圖3

    實現方式:

        SpannableString spanStr10 = new SpannableString("請準守協(xié)議《XXXXXX協(xié)議》");
        spanStr10.setSpan(new ClickableSpan() {
            @Override
            public void onClick(View view) {
                //點擊事件
                Toast.makeText(MainActivity.this,"點擊了我穴吹,可以寫跳轉邏輯",Toast.LENGTH_SHORT).show();
            }
            @Override
            public void updateDrawState(TextPaint ds) {
                ds.setColor(Color.parseColor("#ff4d40"));
            }
        },5,spanStr10.length(),Spanned.SPAN_INCLUSIVE_INCLUSIVE);
        tv10.setMovementMethod(LinkMovementMethod.getInstance()); // 必須的設置這個,不然點擊效果 不生效
        tv10.setHighlightColor(Color.parseColor("#ffffff")); //點擊后顯示的背景色嗜侮,我這里設置了白色港令,默認顏色不好看
        tv10.setText(spanStr10);

還有其它一些常規(guī)用法,我就不一一列舉了锈颗,上圖:

圖3

github地址:https://github.com/A-How/SpanableStringDemo/tree/master

SpanableStringBuilder

定義字符串用String,對于大量字符串進行拼接顷霹,我們可以使用StringBuilder進行處理;SpanableStringBuilder也是對大量SpanableString拼接進行處理的击吱,也同樣使用append方法淋淀。舉個例子:


圖4

代碼實現

        String beforeText = "快快下單";
        String afterText = "(立享200元優(yōu)惠)";
        int beforeSize = 20;
        int afterSize = 15;
        SpannableStringBuilder builder = new SpannableStringBuilder(beforeText);
        builder.setSpan(new ForegroundColorSpan(Color.parseColor("#ffdf40")),0,beforeText.length(),Spanned.SPAN_INCLUSIVE_INCLUSIVE);
        builder.setSpan(new AbsoluteSizeSpan(beforeSize,true),0,beforeText.length(),Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        builder.append(afterText);
        builder.setSpan(new ForegroundColorSpan(Color.parseColor("#ff6940")),beforeText.length(),builder.length(),Spanned.SPAN_INCLUSIVE_INCLUSIVE);
        builder.setSpan(new AbsoluteSizeSpan(afterSize,true),beforeText.length(),builder.length(),Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        tv12.setText(builder);

后續(xù)我會繼續(xù)添加一些關于SpanableString一些Span類的用法,
github地址:https://github.com/A-How/SpanableStringDemo/tree/master

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末覆醇,一起剝皮案震驚了整個濱河市朵纷,隨后出現的幾起案子,更是在濱河造成了極大的恐慌永脓,老刑警劉巖柴罐,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異憨奸,居然都是意外死亡,警方通過查閱死者的電腦和手機凿试,發(fā)現死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門排宰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來似芝,“玉大人,你說我怎么就攤上這事板甘〉澄停” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵盐类,是天一觀的道長寞奸。 經常有香客問我,道長在跳,這世上最難降的妖魔是什么枪萄? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮猫妙,結果婚禮上瓷翻,老公的妹妹穿的比我還像新娘。我一直安慰自己割坠,他們只是感情好齐帚,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著彼哼,像睡著了一般对妄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上敢朱,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天剪菱,我揣著相機與錄音,去河邊找鬼蔫饰。 笑死琅豆,一個胖子當著我的面吹牛,可吹牛的內容都是我干的篓吁。 我是一名探鬼主播茫因,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼杖剪!你這毒婦竟也來了冻押?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤盛嘿,失蹤者是張志新(化名)和其女友劉穎洛巢,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體次兆,經...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡稿茉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片漓库。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡恃慧,死狀恐怖,靈堂內的尸體忽然破棺而出渺蒿,到底是詐尸還是另有隱情痢士,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布茂装,位于F島的核電站怠蹂,受9級特大地震影響,放射性物質發(fā)生泄漏少态。R本人自食惡果不足惜城侧,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望况增。 院中可真熱鬧赞庶,春花似錦、人聲如沸澳骤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽为肮。三九已至摊册,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間颊艳,已是汗流浹背茅特。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留棋枕,地道東北人白修。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像重斑,于是被迫代替她去往敵國和親兵睛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內容