SpannableStringBuilder的使用

1.简介

SpannableStringBuilder和SpannableString也可以用来存储字符串,它们俩都有SetSpan()方法,可以对字符串设置背景色,字体大小颜色,下划线,删除线,粗体斜体等。
SpannableStringBuilder和SpannableString的区别:
SpannableString在构造对象的时候必须一次传入,之后无法再更换String,
SpannableStringBuilder可以使用append方法不断的拼接多个String。
因为Spannable等最终都实现了CharSequence接口,所以可以直接把SpannableString和SpannableStringBuilder通过TextView.setText()设置给TextView。

2.setSpan()
 /*给特定范围的字符串设定Span样式
 * Falg参数标识了当在所标记范围前和标记范围后紧贴着插入新字符时的动作
 * what 对应的各种Span 
 * start Span指定的开始位置,索引从0开始
 * end  Span指定的结束的位置,不包括尾,()包含头不包含尾
 * flags   用来指定范围前后输入新的字符时,会不会应用效果的
  ----Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前后都不包括,即在指定范围的前面和后面插入新字符都不会应用新样式 
  ----Spannable.SPAN_EXCLUSIVE_INCLUSIVE:前面不包括,后面包括。即仅在范围字符的后面插入新字符时会应用新样式
  ----Spannable.SPAN_INCLUSIVE_EXCLUSIVE:前面包括,后面不包括。
  ----Spannable.SPAN_INCLUSIVE_INCLUSIVE:前后都包括。
 */

void setSpan(Object what, int start, int end, int flags)

演示

 EditText et = (EditText) findViewById(R.id.edittext);
        SpannableStringBuilder stringBuilder =new SpannableStringBuilder("我来测试flags属性");
        ForegroundColorSpan span = new ForegroundColorSpan(Color.RED);
        stringBuilder.setSpan(span,1,3, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        et.setText(stringBuilder);

这里用的是 flag : Spanned.SPAN_INCLUSIVE_EXCLUSIVE,在前面插入新字符会改变字体颜色,但范围后面插入的新字符字体颜色不变。


spanablestring_01.png

插入新字符后效果

spanstring_02.png
改变字体大小

AbsoluteSizeSpan span = new AbsoluteSizeSpan(16);

spanstring_text_size.png
改变字体背景颜色

BackgroundColorSpan span = new BackgroundColorSpan(Color.BLUE);

spanstring_text_background.png
改变字体为粗体斜体

StyleSpan span = new StyleSpan(Typeface.BOLD_ITALIC);//粗体斜体

spanstring_bold.png
删除线

StrikethroughSpan span = new StrikethroughSpan();//删除线

spanstring_strikethrough.png
下划线

UnderlineSpan span = new UnderlineSpan();//下划线

spanstring_underline.png
文字换为图片

Drawable d = getResources().getDrawable(R.mipmap.ic_launcher);
d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE);

spanstring_text_to_img.png

示例 (区间价格的显示)
生成效果

spannablestringbuilder_price.png
TextView tvPrice =(TextView)findViewById(R.id.tv_price);
tvPrice.setText(formatPriceString(this,"100.00","230.87","件"));

public static SpannableStringBuilder formatPriceString(Context context, String minPrice, String maxPrice, String unit) {
        try {
            while (minPrice.contains(".") && (minPrice.endsWith("0") || minPrice.endsWith("."))) {
                minPrice = minPrice.subSequence(0, minPrice.length() - 1).toString();
            }
            while (maxPrice.contains(".") && (maxPrice.endsWith("0") || maxPrice.endsWith("."))) {
                maxPrice = maxPrice.subSequence(0, maxPrice.length() - 1).toString();
            }

            Float minPriceFloat = Float.valueOf(minPrice);//100.0
            Float maxPriceFloat = Float.valueOf(maxPrice);//230.87
            DecimalFormat decimalFormat = new DecimalFormat("#0.00");
            boolean isBig = false;
            if (minPriceFloat > tenThousand || maxPriceFloat > tenThousand) {
                isBig = true;
                minPriceFloat = minPriceFloat / 10000;
                maxPriceFloat = maxPriceFloat / 10000;
                minPrice = decimalFormat.format(minPriceFloat);
                maxPrice = decimalFormat.format(maxPriceFloat);
            }
            SpannableStringBuilder builder = new SpannableStringBuilder("价格:¥");
            int dp12 = getPixByDp(12, context);
            int length = builder.length();
            builder.setSpan(new AbsoluteSizeSpan(dp12), 0, length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);//字体大小
            builder.setSpan(new ForegroundColorSpan(Color.parseColor("#919191")), 0, length - 1, Spannable.SPAN_INCLUSIVE_INCLUSIVE);//字体颜色
            builder.setSpan(new ForegroundColorSpan(Color.parseColor("#eb413d")), length - 1, length, Spannable.SPAN_INCLUSIVE_INCLUSIVE);

            SpannableString priceSpan = new SpannableString(minPrice + "~" + maxPrice);
            int dp16 = getPixByDp(16, context);
            int lengthPrice = priceSpan.length();
            priceSpan.setSpan(new AbsoluteSizeSpan(dp16), 0, lengthPrice, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            priceSpan.setSpan(new ForegroundColorSpan(Color.parseColor("#eb413d")), 0, lengthPrice, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
            builder.append(priceSpan);
            SpannableString unitSpan;
            if (!isBig) {
                unitSpan = new SpannableString("元/" + unit);
            } else {
                unitSpan = new SpannableString("万元/" + unit);
            }
            int lengthUnit = unitSpan.length();
            unitSpan.setSpan(new AbsoluteSizeSpan(dp12), 0, lengthUnit, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            unitSpan.setSpan(new ForegroundColorSpan(Color.parseColor("#919191")), 0, lengthUnit, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
            builder.append(unitSpan);
            return builder;
        } catch (Exception e) {

        }
        return new SpannableStringBuilder("");
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容