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