SpannableString的使用

本文详细介绍SpannableString在Android开发中的应用,包括设置文本颜色、大小、样式等多种功能,并通过实例展示了如何实现前景色、背景色、字体大小变化、删除线等效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TextView是一个安卓开发者最常接触的控件之一了,在这里,我们可以用它来显示一个文本,并对里面的文本进行大小、颜色等的设置操作。但是,这么一个控件对于文字的修饰的些许操作已经满足我们的需求了么?答案肯定是:NO!我们可以打开word,看看它为我们的文本编辑提供了哪些修饰的功能?这些功能我们在安卓中又如何实现呢?现在,来小小的总结这个可以将文本进行多种修饰的类:SpannableString。

SpannableString与String一样,都是一个不可变内容的文本。SpannableString的优势在于,它可以根据不同的需求修改它文本的每一个字符样式,例如每一个字符的前景色,背景色,上标,下标,下划线,是否可点击,是否能复制等等。

SpannableString类为文字设置样式使用的方法就是setSpan(Object what, int start, int end, int flags)方法,只要将这个方法的使用方式弄懂,就可以很好地驾驭SpannableString类了。

setSpan(Object what, int start, int end, int flags)方法总共有四个参数,第一个参数what表示要将文字设置成什么样,可以是前景色、背景色也可以是可点击的文本或者下划线等等,第二个参数start表示将要设置格式的字符的起始下标,第三个参数end表示终止下标,flags属性表示开始于终止下标所代表的的字符是否包含于被设置字符,共有四种属性:【Tip:SPAN后有两个字母,第一个字母表示起始下标,第二个字母表示终止下标;其中INCLUSIVE就表示包含,EXCLUSIVE表示不包含;再进一步其实IN表示包含,EX表示不包含】
Spanned.SPAN_INCLUSIVE_EXCLUSIVE 从起始下标到终了下标,包括起始下标,不包括终止下标
Spanned.SPAN_INCLUSIVE_INCLUSIVE 从起始下标到终了下标,包括起始下标,包括终止下标
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE 从起始下标到终了下标,不包括起始下标,不包括终止下标
Spanned.SPAN_EXCLUSIVE_INCLUSIVE 从起始下标到终了下标,不包括起始下标,包括终止下标

SpannableString使用四步曲

1、创建SpannableString对象
2、创建为文字设置的样式
3、为SpannableString对象设置样式
4、将带有样式的文字设置于控件

接下来做几个格式设置的小案例,更多的使用请自行查阅API

1、设置前景色ForegroundColorSpan

TextView tv_test = (TextView) findViewById(R.id.tv_test);
        // 创建SpannableString对象
        SpannableString spannableString = new SpannableString("设置字符的前景色为蓝色");
        // 创建为文字设置的样式
        ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.BLUE);
        // 为SpannableString对象设置样式
        spannableString.setSpan(foregroundColorSpan, 9, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        // 将带有样式的文字设置于控件
        tv_test.setText(spannableString);

2、设置背景色BackgroundColorSpan

TextView tv_test = (TextView) findViewById(R.id.tv_test);
        // 创建SpannableString对象
        SpannableString spannableString = new SpannableString("设置字符的背景色为蓝色");
        // 创建为文字设置的样式
        BackgroundColorSpan colorSpan = new BackgroundColorSpan(Color.BLUE);
        // 为SpannableString对象设置样式
        spannableString.setSpan(colorSpan, 9, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        // 将带有样式的文字设置于控件
        tv_test.setText(spannableString);

【Tip:接下来的代码都如出一辙,就不给注释了】
3、在字符原有大小的基础上设置相对大小RelativeSizeSpan

TextView tv_test = (TextView) findViewById(R.id.tv_test);
        SpannableString spannableString = new SpannableString("大大大大大");
        RelativeSizeSpan sizeSpan1 = new RelativeSizeSpan(1.0f);
        RelativeSizeSpan sizeSpan2 = new RelativeSizeSpan(1.2f);
        RelativeSizeSpan sizeSpan3 = new RelativeSizeSpan(1.4f);
        RelativeSizeSpan sizeSpan4 = new RelativeSizeSpan(1.6f);
        RelativeSizeSpan sizeSpan5 = new RelativeSizeSpan(1.8f);
        spannableString.setSpan(sizeSpan1, 0, 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        spannableString.setSpan(sizeSpan2, 1, 2, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        spannableString.setSpan(sizeSpan3, 2, 3, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        spannableString.setSpan(sizeSpan4, 3, 4, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        spannableString.setSpan(sizeSpan5, 4, 5, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        tv_test.setText(spannableString);

4、为字符设置删除线StrikethroughSpan

TextView tv_test = (TextView) findViewById(R.id.tv_test);
        SpannableString spannableString = new SpannableString("为字符设置删除线");
        StrikethroughSpan strikethroughSpan = new StrikethroughSpan();
        spannableString.setSpan(strikethroughSpan, 5, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        tv_test.setText(spannableString);

5、为字符设置下划线UnderlineSpan

TextView tv_test = (TextView) findViewById(R.id.tv_test);
        SpannableString spannableString = new SpannableString("为字符设置下划线");
        UnderlineSpan underlineSpan = new UnderlineSpan();
        spannableString.setSpan(underlineSpan, 5, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        tv_test.setText(spannableString);

6、为字符设置上标SuperscriptSpan

TextView tv_test = (TextView) findViewById(R.id.tv_test);
        SpannableString spannableString = new SpannableString("为字符设置上标");
        SuperscriptSpan superscriptSpan = new SuperscriptSpan();
        spannableString.setSpan(superscriptSpan, 5, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        tv_test.setText(spannableString);

7、为字符设置下标SubscriptSpan

TextView tv_test = (TextView) findViewById(R.id.tv_test);
        SpannableString spannableString = new SpannableString("为字符设置下标");
        SubscriptSpan subscriptSpan = new SubscriptSpan();
        spannableString.setSpan(subscriptSpan, 5, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        tv_test.setText(spannableString);

8、为字符设置风格-粗体斜体StyleSpan

TextView tv_test = (TextView) findViewById(R.id.tv_test);
        SpannableString spannableString = new SpannableString("为字符设置粗体、斜体");
        StyleSpan styleSpan_BOLD = new StyleSpan(Typeface.BOLD);
        StyleSpan styleSpan_ITALIC = new StyleSpan(Typeface.ITALIC);
        spannableString.setSpan(styleSpan_BOLD, 5, 7, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        spannableString.setSpan(styleSpan_ITALIC, 8, 10, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        tv_test.setText(spannableString);

9、将文字替换成图片ImageSpan

TextView tv_test = (TextView) findViewById(R.id.tv_test);
        SpannableString spannableString = new SpannableString("将后面的表情文字替换成表情图片");
        Drawable drawable = getResources().getDrawable(R.drawable.ic_launcher);
        drawable.setBounds(0, 0, 72, 72);
        ImageSpan imageSpan = new ImageSpan(drawable);
        spannableString.setSpan(imageSpan, 11, 13, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        tv_test.setText(spannableString);

10、将字符设置为可点击ClickableSpan

final TextView tv_test = (TextView) findViewById(R.id.tv_test);

        SpannableString spannableString = new SpannableString("为文字设置点击事件");
        ClickableSpan clickableSpan = new ClickableSpan() {
            // 实现点击事件
            @Override
            public void onClick(View widget) {
                tv_test.setText("我被点击了!!!");
            }

            // 更多的方法实现点击效果,如删除下划线请参照API使用
            @Override
            public void updateDrawState(TextPaint ds) {
                // 不显示下划线
                ds.setUnderlineText(false);
            }
        };
        spannableString.setSpan(clickableSpan, 5, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        // 必须写上这一行才有相应的点击事件
        tv_test.setMovementMethod(LinkMovementMethod.getInstance());
        tv_test.setText(spannableString);

11、为字符设置超链接URLSpan

TextView tv_test = (TextView) findViewById(R.id.tv_test);
        SpannableString spannableString = new SpannableString("为字符设置超链接");
        URLSpan urlSpan = new URLSpan("http://www.baidu.com");
        spannableString.setSpan(urlSpan, 5, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        tv_test.setMovementMethod(LinkMovementMethod.getInstance());
        tv_test.setText(spannableString);

12、为字符设置基于X轴的缩放ScaleXSpan

TextView tv_test = (TextView) findViewById(R.id.tv_test);
        SpannableString spannableString = new SpannableString("为字符设置基于X轴的缩放");
        ScaleXSpan scaleXSpan = new ScaleXSpan(2);
        spannableString.setSpan(scaleXSpan, 5, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        tv_test.setText(spannableString);

我们来小结一下

上面我们总共介绍了12中设置字符样式的API,更多的使用方式和自定义的使用方式,大家可以参考官方API进行使用。
1、设置前景色ForegroundColorSpan
2、设置背景色BackgroundColorSpan
3、在字符原有大小的基础上设置相对大小RelativeSizeSpan
4、为字符设置删除线StrikethroughSpan
5、为字符设置下划线UnderlineSpan
6、为字符设置上标SuperscriptSpan
7、为字符设置下标SubscriptSpan
8、为字符设置风格-粗体斜体StyleSpan
9、将文字替换成图片ImageSpan
10、将字符设置为可点击ClickableSpan
11、为字符设置超链接URLSpan
12、为字符设置基于X轴的缩放ScaleXSpan

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值