TextView 局部文本样式设置之四:SpannableStringBuilder

SpannableStringBuilder 与 SpannableString 的区别就和 String 与 StringBuilder 的区别类似。SpannableStringBuilder 可以使用 append() 方法拼接,而 SpannableString 不可拼接。其他没有多大区别。其实,大部分场景用 SpannableString 就能应付得来,但当一次性需要在头部嵌入多种样式时,SpannableStringBuilder 特有的 insert() 方法就能起到很好的效果:

代码:

        mTextView = (TextView) findViewById(R.id.tv);
        String tvContent = "很骚气的一连串替换";

        CommonTextSpan textSpan = new CommonTextSpan.Builder(SizeUtil.dip2px(this, 15))
                .setTextColor(Color.RED)
                .setTextSize(SizeUtil.sp2px(this, 10))
                .setTextPadding(SizeUtil.dip2px(this, 5))
                .setBgRadius(SizeUtil.dip2px(this, 2))
                .setBgMarginTop(SizeUtil.dip2px(this, 2))
                .setIntervalWidth(SizeUtil.dip2px(this, 5))
                .setBgStroke(Color.RED, 1)
                .build();

        CommonIconSpan iconSpan = new CommonIconSpan.Builder(this, R.mipmap.ic_launcher, SizeUtil.dip2px(this, 14))
                .setIconBgMarginTop(SizeUtil.dip2px(this, 2))
                .setIconIntervalWidth(SizeUtil.dip2px(this, 5))
                .build();

        CommonTextSpan textBgGradientSpan = new CommonTextSpan.Builder(SizeUtil.dip2px(this, 15))
                .setTextColor(Color.RED)
                .setTextSize(SizeUtil.sp2px(this, 10))
                .setTextPadding(SizeUtil.dip2px(this, 5))
                .setBgRadius(SizeUtil.dip2px(this, 2))
                .setBgMarginTop(SizeUtil.dip2px(this, 2))
                .setIntervalWidth(SizeUtil.dip2px(this, 5))
                .setBgGradient(Color.RED, Color.BLUE)
                .build();

        LinkedList<ReplacementSpan> charSequenceList = new LinkedList<>();
        LinkedList<String> contentList = new LinkedList<>();

        charSequenceList.add(textSpan);
        contentList.add("哈哈");
        charSequenceList.add(iconSpan);
        contentList.add(" ");
        charSequenceList.add(textBgGradientSpan);
        contentList.add("靓丽");

        setTitleTag(mTextView, tvContent, charSequenceList, contentList);
    public void setTitleTag(TextView textView, String tvContent,
                            LinkedList<ReplacementSpan> charSequenceList, LinkedList<String> contentList) {
        if (charSequenceList.isEmpty()) {
            textView.setText(tvContent);
        } else {
            SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(tvContent);
            while (!charSequenceList.isEmpty()) {
                String content = contentList.pollLast();
                ReplacementSpan span = charSequenceList.pollLast();
                SpannableString spannableString = new SpannableString(content);
                spannableString.setSpan(span, 0, content.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
                spannableStringBuilder.insert(0, spannableString);
            }
            textView.setText(spannableStringBuilder);
        }
    }

参考文章:
1、https://www.jianshu.com/p/e5bd1287aa4f

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章