SpannableString、SpannableStringBuilder、Html字符串

前言

如下图,在同一个TextView中显示不同的颜色、大小,有两种方法:设置Span和html字符串
图片01

更新

不推荐在代码中使用这种方法来控制显示效果,非常不利于扩展,程序设计的思路应该是界面、逻辑分离。第一次在写layout文件的时候稍微麻烦一点,以后修改、扩展的时候方便得多,java代码简洁、逻辑清晰。


SpannableString、SpannableStringBuilder类概述

SpannableString、SpannableStringBuilder和String都实现了CharSequence接口,都是字符串的载体。不同的是,SpannableString、SpannableStringBuilder还实现了Spannable接口,这个接口中有个setSpan()方法,用来设置字符串的风格(大小、颜色、背景等等),这就是本文要讲的重点。

SpannableStringBuilder比SpannableString多实现了Appendable、Editable等接口,功能更多一些,类似于StringBuilder和String的区别。


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

参数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绘制文字;


各种Span使用

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);   

html字符串

// 占坑,有空了再更新。。。

发布了35 篇原创文章 · 获赞 52 · 访问量 8万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章