Android TextView多种字体色多种样式

Android TextView多种字体色多种样式

有时候一个TextView文本框为了强调内容需要显示不同颜色,显示不同的样式、看了下网上的资料使用
-SpannableStringBuilder
-SpannableString


第一篇博客

  • 第一篇博客、菜鸟一只 、记录学习、
  • 根据网上资料整理!一个多样TextView样式类

SetSpan()

创建完Spannable对象后,就可以为它们设置Span来实现想要的Rich Text了,常见的Span有:

Object what注解
AbsoluteSizeSpan(int size)设置字体大小,参数是绝对数值,相当于Word中的字体大小
RelativeSizeSpan(float proportion)设置字体大小,参数是相对于默认字体大小的倍数,比如默认字体大小是x, 那么设置后的字体大小就是x*proportion,这个用起来比较灵活,proportion>1就是放大(zoom in), proportion<1就是缩小(zoom out)
ScaleXSpan(float proportion)缩放字体,与上面的类似,默认为1,设置后就是原来的乘以proportion,大于1时放大(zoon in),小于时缩小(zoom out)
BackgroundColorSpan(int color)背景着色,参数是颜色数值,可以直接使用android.graphics.Color里面定义的常量,或是用Color.rgb(int, int, int)
ForegroundColorSpan(int color)前景着色,也就是字的着色,参数与背景着色一致
TypefaceSpan(String family)字体,参数是字体的名字比如“sans”, “sans-serif”等
StyleSpan(Typeface style)字体风格,比如粗体,斜体,参数是android.graphics.Typeface里面定义的常量,如Typeface.BOLD,Typeface.ITALIC等等。
StrikethroughSpan()如果设置了此风格,会有一条线从中间穿过所有的字,就像被划掉一样
UnderlineSpan()如果设置了此风格,字符底部会有一条下划线
ImageSpan(Bitmap b)设置图片
URLSpan(String url)设置超链接setText()后必须加上(TextView.setMovementMethod(LinkMovementMethod.getInstance()))否则超链接无效

对于这些Sytle span在使用的时候通常只传上面所说明的构造参数即可,不需要设置其他的属性,如果需要的话,也可以对它们设置其他的属性。

int flags注解
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE前后都不包括,即在指定范围的前面和后面插入新字符都不会应用新样式
Spannable.SPAN_EXCLUSIVE_INCLUSIVE前面不包括,后面包括。即仅在范围字符的后面插入新字符时会应用新样式
Spannable.SPAN_INCLUSIVE_EXCLUSIVE前面包括,后面不包括。
Spannable.SPAN_INCLUSIVE_INCLUSIVE前后都包括。

#

代码块语法代码,例如:

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

根据api 写了一个类

: 代码块:

public class VariedTextString {

    private final String TAG = "VariedTextString";
    private static VariedTextString instance;
    private static SpannableStringBuilder s;

    public VariedTextString() {
        if (s == null) {
            Log.i(TAG, "-------请初始化!-------");
            return;
        }
    }

    public static VariedTextString getInstance(String text) {
        s = new SpannableStringBuilder(text);
        if (instance == null) {
            instance = new VariedTextString();
        }
        return instance;
    }

    public void setText(TextView textView) {
        textView.setText(s);
        //超链接必须添加--否则超链接无效
        textView.setMovementMethod(LinkMovementMethod.getInstance());
    }

    public String getText() {
        return String.valueOf(s);
    }

    private Matcher getLocation(String str) {
        Pattern p = Pattern.compile(str);
        Matcher m = p.matcher(s);
        return m;
    }

    private boolean isPrevention(int start, int end) {
        if (start < 0 || start > s.length()) {
            return false;
        }
        if (end < 0 || end > s.length()) {
            return false;
        }
        return true;
    }

    private void showLog() {
        Log.i(TAG, "-------脚标越界!-------");
    }

    /**
     * 插入数据---新数据
     *
     * @param start
     * @param str
     */
    public void setInsert(int start, String str) {
        if (start >= 0 && start <= s.length()) {
            s = s.insert(start, str);
        } else {
            showLog();
        }
    }

    /**
     * 截取数据---新数据
     *
     * @param start
     * @param end
     */
    public void setIntercept(int start, int end) {
        if (isPrevention(start, end)) {
            String text = getText();
            String substring = text.substring(start, end);
            s = new SpannableStringBuilder(substring);
        } else {
            showLog();
        }
    }

    /**
     * 全文--多个关键字--变色
     *
     * @param color
     * @param keyword
     */
    public void setTextColor(int color, String[] keyword) {
        for (int i = 0; i < keyword.length; i++) {
            Pattern p = Pattern.compile(keyword[i]);
            Matcher m = p.matcher(s);
            while (m.find()) {
                int start = m.start();
                int end = m.end();
                s.setSpan(new ForegroundColorSpan(color), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
        }
    }

    /**
     * 全文--关键字--变色
     *
     * @param color
     * @param keyword
     */
    public void setTextColor(int color, String keyword) {
        Matcher m = getLocation(keyword);
        while (m.find()) {
            int start = m.start();
            int end = m.end();
            s.setSpan(new ForegroundColorSpan(color), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
    }

    /**
     * 全文--关键字--变色
     *
     * @param color
     * @param start
     * @param end
     */
    public void setTextColor(int color, int start, int end) {
        if (isPrevention(start, end)) {
            s.setSpan(new ForegroundColorSpan(color), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        } else {
            showLog();
        }
    }

    /**
     * 按比例缩放
     *
     * @param proportion
     * @param keyword
     */
    public void setZoomTypeface(float proportion, String keyword) {
        Matcher m = getLocation(keyword);
        while (m.find()) {
            int start = m.start();
            int end = m.end();
            s.setSpan(new RelativeSizeSpan(proportion), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
    }

    /**
     * 按比例缩放
     *
     * @param proportion
     * @param start
     * @param end
     */
    public void setZoomTypeface(float proportion, int start, int end) {
        if (isPrevention(start, end)) {
            s.setSpan(new RelativeSizeSpan(proportion), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        } else {
            showLog();
        }
    }

    /**
     * 字体大小--参数是绝对数值
     *
     * @param size
     * @param keyword
     */
    public void setZoomTypeface(int size, String keyword) {
        Matcher m = getLocation(keyword);
        while (m.find()) {
            int start = m.start();
            int end = m.end();
            s.setSpan(new AbsoluteSizeSpan(size), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
    }

    /**
     * 字体大小--参数是绝对数值
     *
     * @param size
     * @param start
     * @param end
     */
    public void setZoomTypeface(int size, int start, int end) {
        if (isPrevention(start, end)) {
            s.setSpan(new AbsoluteSizeSpan(size), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        } else {
            showLog();
        }
    }

    /**
     * 失效字符--加横杠
     *
     * @param keyword
     */
    public void setStrikeSpan(String keyword) {
        Matcher m = getLocation(keyword);
        while (m.find()) {
            int start = m.start();
            int end = m.end();
            s.setSpan(new StrikethroughSpan(), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
    }

    /**
     * 失效字符--加横杠
     *
     * @param start
     * @param end
     */
    public void setStrikeSpan(int start, int end) {
        if (isPrevention(start, end)) {
            s.setSpan(new StrikethroughSpan(), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        } else {
            showLog();
        }
    }

    /**
     * 超链接样式
     *
     * @param keyword
     * @param url
     */
    public void setHttp(String keyword, String url) {
        Matcher m = getLocation(keyword);
        while (m.find()) {
            int start = m.start();
            int end = m.end();
            s.setSpan(new URLSpan(url), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
    }

    /**
     * 超链接样式
     *
     * @param url
     * @param start
     * @param end
     */
    public void setHttp(String url, int start, int end) {
        if (isPrevention(start, end)) {
            s.setSpan(new URLSpan(url), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        } else {
            showLog();
        }
    }

    /**
     * 超链接样式
     *
     * @param start
     * @param end
     */
    public void setHttp(int start, int end, View.OnClickListener listener) {
        if (isPrevention(start, end)) {
            s.setSpan(new Clickable(listener), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        } else {
            showLog();
        }
    }

    /**
     * 超链接样式
     *
     * @param keyword
     */
    public void setHttp(String keyword, View.OnClickListener listener) {
        Matcher m = getLocation(keyword);
        while (m.find()) {
            int start = m.start();
            int end = m.end();
            s.setSpan(new Clickable(listener), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
    }

    /**
     * 背景颜色
     *
     * @param color
     * @param keyword
     */
    public void setBackground(int color, String keyword) {
        Matcher m = getLocation(keyword);
        while (m.find()) {
            int start = m.start();
            int end = m.end();
            s.setSpan(new BackgroundColorSpan(color), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
    }

    /**
     * 背景颜色
     *
     * @param color
     * @param start
     * @param end
     */
    public void setBackground(int color, int start, int end) {
        if (isPrevention(start, end)) {
            s.setSpan(new BackgroundColorSpan(color), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        } else {
            showLog();
        }
    }

    /**
     * 字体
     * android.graphics.Typeface.BOLD_ITALIC
     *
     * @param typeface
     * @param keyword
     */
    public void setTextTypeface(int typeface, String keyword) {
        Matcher m = getLocation(keyword);
        while (m.find()) {
            int start = m.start();
            int end = m.end();
            s.setSpan(new StyleSpan(typeface), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
    }

    /**
     * 字体
     * android.graphics.Typeface.BOLD_ITALIC
     *
     * @param typeface
     * @param start
     * @param end
     */
    public void setTextTypeface(int typeface, int start, int end) {
        if (isPrevention(start, end)) {
            s.setSpan(new StyleSpan(typeface), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        } else {
            showLog();
        }
    }

    /**
     * 下划线
     *
     * @param start
     * @param end
     */
    public void setUnderline(int start, int end) {
        if (isPrevention(start, end)) {
            s.setSpan(new UnderlineSpan(), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        } else {
            showLog();
        }
    }

    /**
     * 下划线
     *
     * @param keyword
     */
    public void setUnderline(String keyword) {
        Matcher m = getLocation(keyword);
        while (m.find()) {
            int start = m.start();
            int end = m.end();
            s.setSpan(new UnderlineSpan(), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
    }

    /**
     * 插入图片
     *
     * @param start
     * @param end
     */
    public void setImage(ImageSpan imageSpan, int start, int end) {
        if (isPrevention(start, end)) {
            s.setSpan(imageSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        } else {
            showLog();
        }
    }

    /**
     * 插入图片
     *
     * @param imageSpan
     * @param keyword
     */
    public void setImage(ImageSpan imageSpan, String keyword) {
        Matcher m = getLocation(keyword);
        while (m.find()) {
            int start = m.start();
            int end = m.end();
            s.setSpan(imageSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
    }

    class Clickable extends ClickableSpan implements View.OnClickListener {
        private final View.OnClickListener mListener;

        public Clickable(View.OnClickListener listener) {
            mListener = listener;
        }

        @Override
        public void onClick(View view) {
            mListener.onClick(view);
        }
    }
}

MainActivity

public class MainActivity extends AppCompatActivity {

 private String str = "因为目前正在做客户端,不得不做一个api出来,想了想客户端源码暂且不说,api还是公布出来吧。 注意:目前只是临时使用的api," + "路径和请求结果可能会发生变化,稳定之后会整理出完整的文档…";

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView mTextView = (TextView) findViewById(R.id.textView);

        VariedTextString mVaried = VariedTextString.getInstance(str);
        mVaried.setIntercept(0, 20);
        mVaried.setInsert(20, "---截取数据---插入数据---设置多种字体颜色---背景颜色--- ");
        mVaried.setTextColor(Color.RED, 2, 7);
        mVaried.setTextColor(Color.WHITE, 7, 12);
        mVaried.setTextColor(Color.BLUE, 12, 17);
        mVaried.setImage(new ImageSpan(this, R.mipmap.ic_launcher), 0, 2);
        mVaried.setZoomTypeface((float) 1.5, "客户端");
        mVaried.setHttp("客户端", new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(MainActivity.this, "点击了客户端", Toast.LENGTH_LONG).show();
            }
        });
        mVaried.setText(mTextView);
    }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值