SpannableString的使用

来源:互联网 发布:js正则表达式判断字母 编辑:程序博客网 时间:2024/04/30 17:23

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