AndroidTextView中的⽂字通过SpannableString,设置不同的颜⾊,。。。
SpannableString其实和String⼀样,都是⼀种字符串类型,SpannableString可以直接作为TextView的显⽰⽂本,不同的是SpannableString可以通过使⽤其⽅法setSpan⽅法实现字符串各种形式风格的显⽰,重要的是可以指定设置的区间,也就是为字符串指定下标区间内的⼦字符串设置格式。
setSpan(Object what, int start, int end, int flags)⽅法需要⽤户输⼊四个参数,what表⽰设置的格式是什么,可以是前景⾊、背景⾊也可以是可点击的⽂本等等,start表⽰需要设置格式的⼦字符串的起始下标,同理end表⽰终了下标,flags属性就有意思了,共有四种属性:
Spanned.SPAN_INCLUSIVE_EXCLUSIVE 从起始下标到终了下标,包括起始下标
Spanned.SPAN_INCLUSIVE_INCLUSIVE 从起始下标到终了下标,同时包括起始下标和终了下标
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE 从起始下标到终了下标,但都不包括起始下标和终了下标
Spanned.SPAN_EXCLUSIVE_INCLUSIVE 从起始下标到终了下标,包括终了下标
SpannableString的setSpan()⽅法可以同时使⽤多个,实现多种效果叠加。
下⾯我们⼀⼀解读⼏种Span常⽤的格式:
ForegroundColorSpan
ForegroundColorSpan,为⽂本设置前景⾊,效果和TextView的setTextColor()类似,实现⽅法如下:
SpannableString spannableString = new SpannableString("设置⽂字的前景⾊为淡蓝⾊");
ForegroundColorSpan colorSpan = new ForegroundColorSpan(Color.parseColor("#0099EE"));
spannableString.setSpan(colorSpan, 9, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);
设置的区间是9到字符串的最后,也就是图中“淡蓝⾊”三字。
BackgroundColorSpan
BackgroundColorSpan,为⽂本设置背景⾊,效果和TextView的setBackground()类,实现⽅法如下:
SpannableString spannableString = new SpannableString("设置⽂字的背景⾊为淡绿⾊");
BackgroundColorSpan colorSpan = new BackgroundColorSpan(Color.parseColor("#AC00FF30"));
spannableString.setSpan(colorSpan, 9, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);
RelativeSizeSpan
RelativeSizeSpan,设置⽂字相对⼤⼩,在TextView原有的⽂字⼤⼩的基础上,相对设置⽂字⼤⼩,实现⽅法如下:
SpannableString spannableString = new SpannableString("万丈⾼楼平地起");
RelativeSizeSpan sizeSpan01 = new RelativeSizeSpan(1.2f);
RelativeSizeSpan sizeSpan02 = new RelativeSizeSpan(1.4f);
RelativeSizeSpan sizeSpan03 = new RelativeSizeSpan(1.6f);
RelativeSizeSpan sizeSpan04 = new RelativeSizeSpan(1.8f);
RelativeSizeSpan sizeSpan05 = new RelativeSizeSpan(1.6f);
RelativeSizeSpan sizeSpan06 = new RelativeSizeSpan(1.4f);
RelativeSizeSpan sizeSpan07 = new RelativeSizeSpan(1.2f);
spannableString.setSpan(sizeSpan01, 0, 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
spannableString.setSpan(sizeSpan02, 1, 2, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
spannableString.setSpan(sizeSpan03, 2, 3, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
spannableString.setSpan(sizeSpan04, 3, 4, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
spannableString.setSpan(sizeSpan05, 4, 5, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
spannableString.setSpan(sizeSpan06, 5, 6, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
spannableString.setSpan(sizeSpan07, 6, 7, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);
StrikethroughSpan
StrikethroughSpan,为⽂本设置中划线,也就是常说的删除线,实现⽅法如下:
SpannableString spannableString = new SpannableString("为⽂字设置删除线");
StrikethroughSpan strikethroughSpan = new StrikethroughSpan();
spannableString.setSpan(strikethroughSpan, 5, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); textView.setText(spannableString);
看到这有没有⼩激动,分分钟实现天猫打折优惠效果,有⽊有?
UnderlineSpan
UnderlineSpan,为⽂本设置下划线,具体实现⽅法如下:
SpannableString spannableString = new SpannableString("为⽂字设置下划线");
UnderlineSpan underlineSpan = new UnderlineSpan();
spannableString.setSpan(underlineSpan, 5, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); textView.setText(spannableString);
SuperscriptSpan
SuperscriptSpan,设置上标,具体实现⽅法如下:
SpannableString spannableString = new SpannableString("为⽂字设置上标");
SuperscriptSpan superscriptSpan = new SuperscriptSpan();
spannableString.setSpan(superscriptSpan, 5, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); textView.setText(spannableString);
从效果图可以看出,被设置为上标的⽂字⼤⼩和下⾯的⽂本⽂字⼤⼩⼀样,只要我们稍加修饰,结合RelativeSizeSpan设置⼩字体⽂本作为上标,分分钟实现指数公式有⽊有,再也不⽤2^2+3^2=13这样缺乏审美的数学公式了,是不是超实⽤?
SubscriptSpan
SubscriptSpan,设置下标,功能与设置上标类似,不做过多描述,具体实现⽅法如下:
SpannableString spannableString = new SpannableString("为⽂字设置下标");
SubscriptSpan subscriptSpan = new SubscriptSpan();
spannableString.setSpan(subscriptSpan, 5, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);
StyleSpan
StyleSpan,为⽂字设置风格(粗体、斜体),和TextView属性textStyle类似,实现⽅法如下:
SpannableString spannableString = new SpannableString("为⽂字设置粗体、斜体风格");textstyle
StyleSpan styleSpan_B  = new StyleSpan(Typeface.BOLD);
StyleSpan styleSpan_I  = new StyleSpan(Typeface.ITALIC);
spannableString.setSpan(styleSpan_B, 5, 7, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
spannableString.setSpan(styleSpan_I, 8, 10, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
textView.setHighlightColor(Color.parseColor("#36969696"));
textView.setText(spannableString);
ImageSpan
ImageSpan,设置⽂本图⽚,实现⽅法如下:
SpannableString spannableString = new SpannableString("在⽂本中添加表情(表情)");
Drawable drawable = getResources().getDrawable(R.mipmap.a9c);
drawable.setBounds(0, 0, 42, 42);
ImageSpan imageSpan = new ImageSpan(drawable);
spannableString.setSpan(imageSpan, 6, 8, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);
这⼀个是不是很炫酷?再加⼀个解析算法,将⽂本中特定的⽂本转换成特定的表情图⽚,分分钟实现聊天表情显⽰效果有⽊有啊朋友们!
ClickableSpan
ClickableSpan,设置可点击的⽂本,设置这个属性的⽂本可以相应⽤户点击事件,⾄于点击事件⽤户可以⾃定义,就像效果图显⽰⼀样,⽤户可以实现点击跳转页⾯的效果,具体实现⽅法如下:
SpannableString spannableString = new SpannableString("为⽂字设置点击事件");
MyClickableSpan clickableSpan = new MyClickableSpan("www.jianshu/users/dbae9ac95c78");
spannableString.setSpan(clickableSpan, 5, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
textView.Instance());
textView.setHighlightColor(Color.parseColor("#36969696"));
textView.setText(spannableString);
/***************************************************************/
class MyClickableSpan extends ClickableSpan {
private String content;
public MyClickableSpan(String content) {
}
@Override
public void updateDrawState(TextPaint ds) {
ds.setUnderlineText(false);
}
@Override
public void onClick(View widget) {
Intent intent = new Intent(MainActivity.this, OtherActivity.class);
Bundle bundle = new Bundle();
bundle.putString("content", content);
intent.putExtra("bundle", bundle);
startActivity(intent);
}
}
也可直接设置:
SpannableString spStr = new SpannableString(url_0_text);
spStr.setSpan(new ClickableSpan() {
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setColor(Color.WHITE);      //设置⽂件颜⾊
ds.setUnderlineText(true);      //设置下划线
}
@Override
public void onClick(View widget) {
Log.d("", "");
}
}, 0, url_0_text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textview.Instance());//开始响应点击事件
texrview.serText(spStr)
代码中我们⾃定义MyClickableSpan类,继承⾄ClickableSpan,并重写其中⼀些⽅法。ds.setUnderlineText()控制是否让可点击⽂本显⽰下划线,很明显,在上⾯代码中我选择了false,不显⽰下滑写。onClick点击事件的具体实现⽅法写在其中。如上代码,我们重写ClickableSpan的onClick⽅法实现Activity的跳转效果,并传递跳转数据。
注意:使⽤ClickableSpan的⽂本如果想真正实现点击作⽤,必须为TextView设置setMovementMethod⽅法,否则没有点击相应,⾄于setHighlightColor⽅法则是控制点击是的背景⾊。
URLSpan
URLSpan,设置超链接⽂本,其实聪明的⼩伙帮在讲到ClickableSpan的时候就能实现超链接⽂本的效果了,重写onClick点击事件就⾏,也确实看了URLSpan的源码,URLSpan就是继承⾃ClickableSpan,也和想象中⼀样,就是重写了⽗类的onClick事件,⽤系统⾃带浏览器打开链接,具体实现⽅法如下:
SpannableString spannableString = new SpannableString("为⽂字设置超链接");
URLSpan urlSpan = new URLSpan("www.jianshu/users/dbae9ac95c78");
spannableString.setSpan(urlSpan, 5, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
textView.Instance());
textView.setHighlightColor(Color.parseColor("#36969696"));
textView.setText(spannableString);
URLSpan onClick事件的源码如下:
@Override
public void onClick(View widget) {
Uri uri = Uri.parse(getURL());
Context context = Context();
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.putExtra(Browser.EXTRA_APPLICATION_ID, PackageName());
try {
context.startActivity(intent);
} catch (ActivityNotFoundException e) {
Log.w("URLSpan", "Actvity was not found for intent, " + String());
}
}
除此之外,还有MaskFilterSpan可以实现模糊和浮雕效果,RasterizerSpan可以实现光栅效果,因为以上两个使⽤频率不⾼,⽽且效果也不是很明显,就不做详细说明,有兴趣的⼩伙伴不妨去试⼀试。
SpannableStringBuilder
应该有不少开发的⼩伙伴知道StringBuilder,可以使⽤append()⽅法实现字符串拼接,⾮常⽅便。同样,SpannableString中也有SpannableStringBuilder,顾名思义,就是实现对,SpannableString的⼀个拼接效果,同样是append()⽅法,可以实现各种风格效果的SpannableString拼接,⾮常实⽤。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。