文章目录
- SpannableString、SpannableStringBuilder与String的关系
- SpannableString与SpannableStringBuilder区别
- SetSpan()
-
- 函数意义
- 参数说明
- 各种Span设置
-
- 字体颜色设置(ForegroundColorSpan)
- 字体背景颜色(BackgroundColorSpan)
- 字体大小(AbsoluteSizeSpan)
- 粗体、斜体(StyleSpan)
- 删除线(StrikethroughSpan)
- 下划线(UnderlineSpan)
- 图片置换(ImageSpan)
SpannableString、SpannableStringBuilder与String的关系
首先
SpannableString
、
SpannableStringBuilder
基本上与
String
差不多,也是用来存储字符串,但它们俩的特殊就在于有一个
SetSpan()
函数,能给这些存储的String添加各种格式或者称样式(Span),将原来的String以不同的样式显示出来
比如在原来String上加下划线、加背景色、改变字体颜色、用图片把指定的文字给替换掉,等等。所以,总而言之,
SpannableString
、
SpannableStringBuilder
与
String
一样, 首先也是传字符串,但
SpannableString
、
SpannableStringBuilder
可以对这些字符串添加额外的样式信息,但
String
则不行
注意:如果这些额外信息能被所用的方式支持,比如将
SpannableString
传给TextView;也有对这些额外信息不支持的,对于不支持的情况,
SpannableString
和
SpannableStringBuilder
就是退化为
String
类型,直接显示原来的String字符串,而不会再显示这些附加的额外信息
SpannableString与SpannableStringBuilder区别
它们的区别在于
SpannableString
像一个String一样,构造对象的时候传入一个String,之后再无法更改String的内容,也无法拼接多个
SpannableString
;而
SpannableStringBuilder
则更像是
StringBuilder
,它可以通过其
append()
方法来拼接多个String
SpannableString word = new SpannableString("代码狂欢到深夜");
SpannableStringBuilder multiWord = new SpannableStringBuilder();
multiWord.append("代码");
multiWord.append("狂欢");
multiWord.append("到深夜");
SetSpan()
void setSpan (Object what, int start, int end, int flags)
函数意义
给
SpannableString
或
SpannableStringBuilder
特定范围的字符串设定Span样式,可以设置多个(比如同时加上下划线和删除线等),Falg参数标识了当在所标记范围前和标记范围后紧贴着插入新字符时的动作,即是否对新插入的字符应用同样的样式
参数说明
- object what :对应的各种Span
- int start:开始应用指定Span的位置,索引从0开始
- int end:结束应用指定Span的位置,特效并不包括这个位置。比如如果这里数为3(即第4个字符),第4个字符不会有任何特效
- int flags:取值有如下四个
:前后都不包括,即在指定范围的前面和后面插入新字符都不会应用新样式Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
:前面不包括,后面包括。即仅在范围字符的后面插入新字符时会应用新样式Spannable.SPAN_EXCLUSIVE_INCLUSIVE
:前面包括,后面不包括Spannable.SPAN_INCLUSIVE_EXCLUSIVE
:前后都包括Spannable.SPAN_INCLUSIVE_INCLUSIVE
例子
xml代码
<EditText
android:id="@+id/edit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
java代码
public class MainActivity extends AppCompatActivity {
EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText) findViewById(R.id.edit);
//改变字体颜色
//先构造SpannableString
SpannableString spannableString = new SpannableString("代码狂欢到深夜");
//再构造一个改变字体颜色的Span
ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.RED);
//将这个Span应用于指定范围的字体
spannableString.setSpan(foregroundColorSpan,2,4, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
editText.setText(spannableString);
}
}
效果
在指定字符后输入后使用样式
在指定字符前输入不使用样式
各种Span设置
要应用一个Span总共分三步:
1、构造String
2、构造Span
3、利用SetSpan()对指定范围的String应用这个Span
字体颜色设置(ForegroundColorSpan)
//改变字体颜色
//先构造SpannableString
SpannableString spannableString = new SpannableString("代码狂欢到深夜");
//再构造一个改变字体颜色的Span
ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.RED);
//将这个Span应用于指定范围的字体
spannableString.setSpan(foregroundColorSpan,2,4, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
editText.setText(spannableString);
字体背景颜色(BackgroundColorSpan)
SpannableString spannableString = new SpannableString("代码狂欢到深夜");
BackgroundColorSpan backgroundColorSpan = new BackgroundColorSpan(Color.RED);
spannableString.setSpan(backgroundColorSpan,2,4, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
editText.setText(spannableString);
字体大小(AbsoluteSizeSpan)
SpannableString spannableString = new SpannableString("代码狂欢到深夜");
AbsoluteSizeSpan absoluteSizeSpan = new AbsoluteSizeSpan(30);
spannableString.setSpan(absoluteSizeSpan,2,4, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
editText.setText(spannableString);
粗体、斜体(StyleSpan)
SpannableString spannableString = new SpannableString("代码狂欢到深夜");
StyleSpan styleSpan = new StyleSpan(Typeface.BOLD_ITALIC);
spannableString.setSpan(styleSpan,2,4, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
editText.setText(spannableString);
删除线(StrikethroughSpan)
SpannableString spannableString = new SpannableString("代码狂欢到深夜");
StrikethroughSpan strikethroughSpan = new StrikethroughSpan();
spannableString.setSpan(strikethroughSpan,2,4, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
editText.setText(spannableString);
下划线(UnderlineSpan)
SpannableString spannableString = new SpannableString("代码狂欢到深夜");
UnderlineSpan underlineSpan = new UnderlineSpan();
spannableString.setSpan(underlineSpan,2,4, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
editText.setText(spannableString);
图片置换(ImageSpan)
SpannableString spannableString = new SpannableString("代码狂欢到深夜");
Drawable d = getResources().getDrawable(R.drawable.heart);
d.setBounds(0,0,d.getIntrinsicWidth(),d.getIntrinsicHeight());
ImageSpan imageSpan = new ImageSpan(d,ImageSpan.ALIGN_BASELINE);
spannableString.setSpan(imageSpan,2,4, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
editText.setText(spannableString);
总结自:启航大神的博客http://blog.csdn.net/harvic880925/article/details/38984705