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

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