zoukankan      html  css  js  c++  java
  • Spannable辅助类:实现不同字体、颜色

    Spannable辅助类:实现不同字体、颜色

    标签:Android


    我们经常会遇到一种情景,就是一行文字,却有不同的字体或不同的颜色,比如这样:

    一般来说,有三种方案来实现:多个TextView、使用Html标签、使用Spannable

    这里,Html标签的方式在不同字体时不好处理,可以忽略。而多个TextView的方式呢,会增加视图的个数,有点low。

    但是,Spannable这个玩意呢,虽然看起来无所不能,但是使用起来真是麻烦的一逼,文本的下标一不小心搞错了就会出错。所以呢,我对Spannable做了一下简单的封装,方便快速使用。目前仅支持同一个TextView显示不同字体、不同颜色。

    示例代码

    tvTitle.setText(SpannableBuilder.create(this)
            .append("关联店铺", R.dimen.sp16, R.color.text_33)
            .append("(请添加您的所有店铺)", R.dimen.sp12, R.color.text_99)
            .build());

    辅助类

    import android.content.Context;
    import android.text.Spannable;
    import android.text.SpannableStringBuilder;
    import android.text.style.AbsoluteSizeSpan;
    import android.text.style.ForegroundColorSpan;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 作者:余天然 on 2017/2/22 下午4:06
     */
    public class SpannableBuilder {
    
        private Context context;
        private List<SpanWrapper> list;
    
        private SpannableBuilder(Context context) {
            this.context = context;
            this.list = new ArrayList<>();
        }
    
        public SpannableBuilder append(String text, int textSize, int textColor) {
            list.add(new SpanWrapper(text, textSize, textColor));
            return this;
        }
    
        public Spannable build() {
            SpannableStringBuilder textSpan = new SpannableStringBuilder();
    
            int start = 0;
            int end = 0;
    
            for (int i = 0; i < list.size(); i++) {
                SpanWrapper wrapper = list.get(i);
                String text = wrapper.getText();
                start = end;
                end = end + text.length();
                textSpan.append(text);
    
                AbsoluteSizeSpan sizeSpan = new AbsoluteSizeSpan(getContext().getResources().getDimensionPixelSize(wrapper.getTextSize()));
                ForegroundColorSpan colorSpan = new ForegroundColorSpan(getContext().getResources().getColor(wrapper.getTextColor()));
    
                textSpan.setSpan(sizeSpan, start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
                textSpan.setSpan(colorSpan, start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
            }
            return textSpan;
        }
    
        public static SpannableBuilder create(Context context) {
            return new SpannableBuilder(context);
        }
    
        public Context getContext() {
            return context;
        }
    
        private class SpanWrapper {
            String text;
            int textSize;
            int textColor;
    
            public SpanWrapper(String text, int textSize, int textColor) {
                this.text = text;
                this.textSize = textSize;
                this.textColor = textColor;
            }
    
            public String getText() {
                return text;
            }
    
            public void setText(String text) {
                this.text = text;
            }
    
            public int getTextSize() {
                return textSize;
            }
    
            public void setTextSize(int textSize) {
                this.textSize = textSize;
            }
    
            public int getTextColor() {
                return textColor;
            }
    
            public void setTextColor(int textColor) {
                this.textColor = textColor;
            }
        }
    }
  • 相关阅读:
    WPF画辐射图
    WPF 获取表格里面的内容
    C# 动态生成Html地图文件
    C#如何关闭指定进程
    oracle EM 打不开 503 |OracleDBConsoleorcl 启动不了
    oracle windows 下修复无监听错误-12541/12514
    Oracle 命令汇总
    oracle 函数 bitand 与 decode
    一.Git 初步扫盲
    修改字段类型
  • 原文地址:https://www.cnblogs.com/yutianran/p/9921498.html
Copyright © 2011-2022 走看看