Android中的SpannableString与SpannableStringBuilder
详解
前⾔
最近在学习Android开发,发现确实有太多东西需要去整理,去学习。慢慢来吧,任何东东的深⼊学习都是不简单的。今天稍微整理下SpannableString与SpannableStringBuilder,因为在上篇中,我们曾讲到过有关CharSequence的东东,有关CharSequence的话,这两个类是必谈的,所以这⾥加以整理。
⼀、概述
1、SpannableString、SpannableStringBuilder与String的关系
⾸先SpannableString、SpannableStringBuilder基本上与String差不多,也是⽤来存储字符串,但它们俩的特殊就在于有⼀
个SetSpan()函数,能给这些存储的String添加各种格式或者称样式(Span),将原来的String以不同的样式显⽰出来,⽐如在原来String上加下划线、加背景⾊、改变字体颜⾊、⽤图⽚把指定的⽂字给替换掉,等等。所以,总⽽⾔
之,SpannableString、SpannableStringBuilder与String⼀样,⾸先也是传字符串,但SpannableString、SpannableStringBuilder可以对这些字符串添加额外的样式信息,但String则不⾏。
注意:如果这些额外信息能被所⽤的⽅式⽀持,⽐如将SpannableString传给TextView;也有对这些额外信息不⽀持的,⽐如前⼀章讲到的Canvas绘制⽂字,对于不⽀持的情况,SpannableString和SpannableStringBuilder就是退化为String类型,直接显⽰原来的String字符串,⽽不会再显⽰这些附加的额外信息。
2、SpannableString与SpannableStringBuilder区别
它们的区别在于 SpannableString像⼀个String⼀样,构造对象的时候传⼊⼀个String,之后再⽆法更改String的内容,也⽆法拼接多个 SpannableString;⽽SpannableStringBuilder则更像是StringBuilder,它可以通过其append()⽅法来拼接多个String:
//使⽤SpannableString,必须⼀次传⼊,构造完成
SpannableString word = new SpannableString("欢迎光临Harvic的博客");
//使⽤SpannableStringBuilder,可以使⽤append()再添加
SpannableStringBuilder multiWord = new SpannableStringBuilder();
multiWord.append("欢迎光临");
multiWord.append("Harvic的");
multiWord.append("博客");
(转⾃博客:《》)
因为Spannable等最终都实现了CharSequence接⼝,所以可以直接把SpannableString和SpannableStringBuilder通
过TextView.setText()设置给TextView。
3、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:前后都包括。
举个例⼦来说明这个前后包括的问题:
由于Flag的作⽤是⽤来指定范围前后输⼊新的字符时,会不会应⽤效果的,所以我们利⽤EditText来显⽰SpannableString
(1)、布局XML中加⼊⼀个EditText控件:
<RelativeLayout xmlns:android="schemas.android/apk/res/android"
xmlns:tools="schemas.android/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="_spannable_blog.MainActivity" >
<EditText
android:id="@+id/edit"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
(2)、这⾥⽤⼀个改变字体颜⾊的Span来做下演⽰
字符串函数应用详解public class MainActivity extends Activity {
private EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_main);
editText = (EditText)findViewById(R.id.edit);
//改变字体颜⾊
//先构造SpannableString
SpannableString spanString = new SpannableString("欢迎光临Harvic的博客");
//再构造⼀个改变字体颜⾊的Span
ForegroundColorSpan span = new ForegroundColorSpan(Color.BLUE);
//将这个Span应⽤于指定范围的字体
spanString.setSpan(span, 1, 3, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
//设置给EditText显⽰出来
editText.setText(spanString);
}
}
初始化效果是这样的:
分别在设置Span的前⾯和后⾯加⼊新⽂字,结果是这样的
在前⾯和后⾯都加⼊虾⽶两个字,可见,前⾯的虾⽶没有任何效果,后⾯的则不同,添加上相同的Span特效,这是由于我们设置了Spannable.SPAN_EXCLUSIVE_INCLUSIVE的原因,即(前⾯不应⽤特效,后⾯应⽤特效),其它⼏个Flags参数的含义想必⼤家也都清楚了。在此就不再赘述。
⼆、各种Span设置
在前⾯的⼀个⼩⽰例,⼤家应该也可以看出,要应⽤⼀个Span总共分三步:
1、构造String
2、构造Span
3、利⽤SetSpan()对指定范围的String应⽤这个Span
1、字体颜⾊设置(ForegroundColorSpan)
SpannableString spanString = new SpannableString("欢迎光临Harvic的博客");
//再构造⼀个改变字体颜⾊的Span
ForegroundColorSpan span = new ForegroundColorSpan(Color.BLUE);
//将这个Span应⽤于指定范围的字体
spanString.setSpan(span, 1, 5, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
//设置给EditText显⽰出来
editText.setText(spanString);
效果:
2、字体背景颜⾊(BackgroundColorSpan)
SpannableString spanString = new SpannableString("欢迎光临Harvic的博客");
BackgroundColorSpan span = new BackgroundColorSpan(Color.YELLOW);
spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
editText.setText(spanString);
3、字体⼤⼩(AbsoluteSizeSpan)
SpannableString spanString = new SpannableString("欢迎光临Harvic的博客");
AbsoluteSizeSpan span = new AbsoluteSizeSpan(16);
spanString.setSpan(span, 2, 5, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
editText.setText(spanString);
4、粗体、斜体(StyleSpan)
SpannableString spanString = new SpannableString("欢迎光临Harvic的博客"); StyleSpan span = new StyleSpan(Typeface.BOLD_ITALIC);
spanString.setSpan(span, 1, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); editText.setText(spanString);
5、删除线(StrikethroughSpan)
SpannableString spanString = new SpannableString("欢迎光临Harvic的博客"); StrikethroughSpan spa
n = new StrikethroughSpan();
spanString.setSpan(span, 2, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); editText.setText(spanString);
6、下划线(UnderlineSpan)
SpannableString spanString = new SpannableString("欢迎光临Harvic的博客"); UnderlineSpan span = new UnderlineSpan();
spanString.setSpan(span, 1, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); editText.setText(spanString);
7、图⽚置换(ImageSpan)
SpannableString spanString = new SpannableString("欢迎光临Harvic的博客"); 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);
这个函数的不同之处在于,前⼏都是在原来⽂字的基础上加上特效,⽽这⾥却是利⽤图⽚将⽂字替换。如果遇到不⽀持显⽰图⽚的函数,⽐如前⼀篇中的canvas绘图。就会退化成String,即以原来的String字符串来显⽰。
总结
以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,如果有疑问⼤家可以留⾔交流,谢谢⼤家对的⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论