如下图,在同一个TextView中显示不同的颜色、大小,有两种方法:设置Span和html字符串
不推荐在代码中使用这种方法来控制显示效果,非常不利于扩展,程序设计的思路应该是界面、逻辑分离。第一次在写layout文件的时候稍微麻烦一点,以后修改、扩展的时候方便得多,java代码简洁、逻辑清晰。
SpannableString、SpannableStringBuilder和String都实现了CharSequence接口,都是字符串的载体。不同的是,SpannableString、SpannableStringBuilder还实现了Spannable接口,这个接口中有个setSpan()方法,用来设置字符串的风格(大小、颜色、背景等等),这就是本文要讲的重点。
SpannableStringBuilder比SpannableString多实现了Appendable、Editable等接口,功能更多一些,类似于StringBuilder和String的区别。
参数1:各种类型的Span,比如控制字体大小的Span、控制字体颜色的Span等等;
参数2:开始应用Span的位置,索引从0开始;
参数3:结束应用Span的位置,并不包括这个位置。比如end为3(即第4个字符),第4个字符不会有效果;
参数4:效果影响的模式,有下面4种;
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前后都不包括,即在指定范围的前面和后面插入新字符都不会应用新样式
Spannable.SPAN_EXCLUSIVE_INCLUSIVE :前面不包括,后面包括。即仅在范围字符的后面插入新字符时会应用新样式
Spannable.SPAN_INCLUSIVE_EXCLUSIVE :前面包括,后面不包括。
Spannable.SPAN_INCLUSIVE_INCLUSIVE :前后都包括。
tips1:setSpan()方法会将设置的Span存入一个数组中,所以各种效果是可以叠加的;
tips2:通过setSpan()方法设置的Span,主要是用于在控件中显示,只有控件才能读取到其中的Span信息,在其它地方,无法读取到其中的Span信息,只能读取到String信息,比如Canvas绘制文字;
1、字体颜色设置(ForegroundColorSpan)
// 通过String构造SpannableString
SpannableString spanString = new SpannableString("同一个TextView显示不同效果");
// 构造ForegroundColorSpan
ForegroundColorSpan span = new ForegroundColorSpan(0xfe8026);
//将ForegroundColorSpan应用于指定范围的字体
spanString.setSpan(span, 2, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置显示
editText.setText(spanString);
2、字体背景颜色(BackgroundColorSpan)
SpannableString spanString = new SpannableString("同一个TextView显示不同效果");
BackgroundColorSpan span = new BackgroundColorSpan(0xfe8026);
spanString.setSpan(span, 2, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
editText.setText(spanString);
3、字体大小(AbsoluteSizeSpan)
SpannableString spanString = new SpannableString("同一个TextView显示不同效果");
// 这里的大小是px值,最好通过dp2px转换一下
AbsoluteSizeSpan span = new AbsoluteSizeSpan(18);
spanString.setSpan(span, 2, 5, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
editText.setText(spanString);
4、粗体、斜体(StyleSpan)
SpannableString spanString = new SpannableString("同一个TextView显示不同效果");
StyleSpan span = new StyleSpan(Typeface.BOLD_ITALIC);
spanString.setSpan(span, 2, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
editText.setText(spanString);
5、删除线(StrikethroughSpan)
SpannableString spanString = new SpannableString("同一个TextView显示不同效果");
StrikethroughSpan span = new StrikethroughSpan();
spanString.setSpan(span, 2, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
editText.setText(spanString);
6、下划线(UnderlineSpan)
SpannableString spanString = new SpannableString("同一个TextView显示不同效果");
UnderlineSpan span = new UnderlineSpan();
spanString.setSpan(span, 2, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
editText.setText(spanString);
7、图片置换(ImageSpan)
SpannableString spanString = new SpannableString("同一个TextView显示不同效果");
Drawable d = getResources().getDrawable(R.drawable.ic_launcher);
d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE);
spanString.setSpan(span, 2, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
editText.setText(spanString);
// 占坑,有空了再更新。。。