SpannableString、SpannableStringBuilder、Html字符串

来源:互联网 发布:淘宝提前收款什么意思 编辑:程序博客网 时间:2024/05/22 04:47

前言

如下图,在同一个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字符串

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

0 0