前言TextView是Android中最简单最常用的文本控件,几乎每个页面都有TextView;在大多数情况下,我们使用TextView只是简单地显示一段文字;但是一个简单的TextView也可以千变万化的展示各种效果,这都要归功于SpannableString;今天我们来解释;一、SpannableString简介SpannableString其实是一个字符串类型,和String一样。TextView也可以直接设置SpannableString为显示文本。不同的是,SpannableString可以通过其方法setSpan方法显示各种样式的字符串。重要的是可以指定设置区间,即为字符串指定下标区间子串设置格式;setSpan(Objectwhat,intstart,intend,intflags)方法需要用户输入四个参数,what表示要设置的格式,可以是前景色,背景色或者可点击的Text等,start表示需要格式化的子串的起始下标,end表示结束下标。flags属性很有趣。有四个属性:Spanned.SPAN_INCLUSIVE_EXCLUSIVE从开始下标到结束下标Spanned.SPAN_INCLUSIVE_INCLUSIVE从开始下标到结束下标,包括开始下标和结束下标Spanned.SPAN_EXCLUSIVE_EXCLUSIVE从开始下标到结束下标,但不包括开始下标和结束下标ClickableSpan文本可以被点击,有点击事件;ForegroundColorSpan文本颜色(前景色);MaskFilterSpan修饰效果,如模糊(BlurMaskFilter)、浮雕(EmbossMaskFilter);遇见ricAffectingSpan父类,一般不用;RasterizerSpan栅格效果;StrikethroughSpan删除线(中线);SuggestionSpan相当于占位符;UnderlineSpan下划线;AbsoluteSizeSpan绝对大小(文字字体);图像;RelativeSizeSpan相对大小(文字字体);ReplacementSpan父类,一般不用;基于x轴缩放的ScaleXSpan;StyleSpan字体样式:粗体、斜体等;SubscriptSpan下标(会用到数学公式);SuperscriptSpan上标(会用到数学公式);TextAppearanceSpan文本外观(包括字体、大小、样式和颜色);TypefaceSpan文字字体;URLSpan文本超链接;二、效果实现1、绝对大小AbsoluteSizeSpan是建立一个绝对大小类,它有两个参数,第一个表示字体大小,第二个表示是否使用DIP,如果为false,单位为px,如果为true,单位是dp;SpannableStringss=newSpannableString(txAbsoluteSize.getText());ss.setSpan(newAbsoluteSizeSpan(12,true),2,4,SPAN_EXCLUSIVE_EXCLUSIVE);txAbsoluteSize.setText(ss);2。相对字体大小的相对大小更简单。你只需要传入一个相对的字体大小。比如我们传入1.5,那么中间的两个字符就会变成原来字体大小的1.5倍;SpannableStringss=newSpannableString(txRelativeSize.getText());ss.setSpan(newRelativeSizeSpan(1.5f),2,4、SPAN_EXCLUSIVE_EXCLUSIVE);txRelativeSize.setText(ss);3.前景色SpannableStringss=newSpannableString(txForegroundColor.getText());ss.setSpan(newForegroundColorSpan(Color.BLUE),0,txForegroundColor.getText().length(),SPAN_EXCLUSIVE_EXCLUSIVE);txForegroundColor.setText(ss);4、背景色SpannableStringss=newSpannableString(txBackgroundColor.getText());ss.setSpan(newBackgroundColorSpan(Color.LTGRAY),0,txBackgroundColor.getText().length(),SPAN_EXCLUSIVE_EXCLUSIVE);txBackgroundColor.setText(ss);5、粗斜体bold,italic,bolditalic对应的常量有:Typeface.BOLD,Typeface.ITALIC,Typeface.BOLD_ITALICSpannableStringss=newSpannableString(txBord.getText());ss.setSpan(newStyleSpan(Typeface.BOLD),0,txBord.getText();,0,txDeleteLine.getText().length(),SPAN_EXCLUSIVE_EXCLUSIVE);txDeleteLine.setText(ss);7.点击事件添加ClickableSpanusingSpannableStringspannableString=newSpannableString("要点击的内容");spannableString.setSpan(newForegroundColorSpan(getResources().getColor(R.color.theme_default)),0,6,Spanned.SPAN_INCLUSIVE_EXCLUSIVE);//修改字体颜色ClickableSpanclickableSpan=newClickableSpan(){//添加点击@OverridepublicvoidonClick(Viewwidget){onMyCommentClick(widget);//点击事件}@OverridepublicvoidupdateDrawState(TextPaintds){//去除连接下划线ds.setColor(ds.linkColor);ds.setUnderlineText(false);}};spannableString.setSpan(clickableSpan,0,6,Spanned.SPAN_INCLUSIVE_EXCLUSIVE);txtView.setMovementMethod(LinkMovementMethod.getInstance());//这句话一定要加,否则点击不响应txtView.setText(spannableString);8、underline下划线使用的类是UnderlineSpanSpannableStringss=newSpannableString(txUnderLine.getText());ss.setSpan(newUnderlineSpan(),0,txUnderLine.getText().length(),SPAN_EXCLUSIVE_EXCLUSIVE);txUnderLine.setText(ss);9.插入图片或表达式SpannableString除mak和以前一样将文字变大、变小、变长、变色,还可以将部分文字变成图片。图片由Drawable对象携带,使用imageSpan实现这种效果;SpannableStringss=newSpannableString(str);ImageSpanspan=newImageSpan(drawable,ImageSpan.ALIGN_BOTTOM);ss.setSpan(span,0,str.length(),SPAN_EXCLUSIVE_EXCLUSIVE);10、文本上下标SpannableStringss=newSpannableString(txSubSuperScript.getText());ss.setSpan(newSuperscriptSpan(),2,3,SPAN_EXCLUSIVE_EXCLUSIVE);ss.setSpan(newSubscriptSpan(),5,6,SPAN_EXCLUSIVE_EXCLUSIVE);txSubSuperScript.setText(ss);11.超链接形式SpannableString支持6种超链接形式,分别是:电话超链接、邮件超链接、URL超链接、短信超链接、彩信超链接、地图超链接;11.1.电话超链接:URLSpan,其实这6个超链接都是用URLSpan构造的,只是构造函数传入的链接格式不一样,电话超链接是在tel:开头传入的,后面是要拨的电话号码.点击后会自动跳转拨打电话;SpannableStringss=newSpannableString(txTelUrl.getText());ss.setSpan(newURLSpan("tel:02512345678"),0,txTelUrl.getText().length(),SPAN_EXCLUSIVE_EXCLUSIVE);txTelUrl.setText(ss);txTelUrl.setMovementMethod(LinkMovementMethod.getInstance());11.2.电子邮件超链接以mailto:开头,后跟电子邮件地址点击后会自动跳转到邮件app;SpannableStringss=newSpannableString(txMailUrl.getText());ss.setSpan(newURLSpan("mailto:xxx@google.com"),0,txMailUrl.getText().length(),SPAN_EXCLUSIVE_EXCLUSIVE);txMailUrl.setText(ss);txMailUrl.setMovementMethod(LinkMovementMethod.getInstance());11.3.URL超链接URL超链接以http://或https://开头,后面是URL,点击跳转浏览器app,如果有多个浏览器,也需要做出选择;SpannableStringss=newSpannableString(txWebUrl.getText());ss.setSpan(newURLSpan("http://www.baidu.com"),0,txWebUrl.getText().length(),SPAN_EXCLUSIVE_EXCLUSIVE);txWebUrl.setText(ss);txWebUrl.setMovementMethod(LinkMovementMethod.getInstance());11.4.短信超链接短信超链接以sms:开头,后面是手机号,点击跳转系统短信app后;SpannableStringss=newSpannableString(txSmsUrl.getText());ss.setSpan(newURLSpan("sms:02512345678"),0,txSmsUrl.getText().length(),SPAN_EXCLUSIVE_EXCLUSIVE);txSmsUrl.setText(ss);txSmsUrl.setMovementMethod(LinkMovementMethod.getInstance());11.5.彩信超链接彩信超链接以mms:开头,后接手机号码,点击跳转到系统短信应用;SpannableStringss=newSpannableString(txMmsUrl.getText());ss.setSpan(newURLSpan("mms:02512345678"),0,txMmsUrl.getText().length(),SPAN_EXCLUSIVE_EXCLUSIVE);txMmsUrl.setText(ss);txMmsUrl.setMovementMethod(LinkMovementMethod.getInstance());11.6.地图超链接地图超链接以geo:开头,后面是经纬度,点击跳转到地图app;SpannableStringss=newSpannableString(txGeoUrl.getText());ss.setSpan(newURLSpan("geo:30.123456,-50.024456"),0,txGeoUrl.getText().length(),SPAN_EXCLUSIVE_EXCLUSIVE);txGeoUrl.setText(ss);txGeoUrl.setMovementMethod(LinkMovementMethod.getInstance());12、添加BulletSpan类构建工程符号,第一个参数为子弹占用的宽度,第二个参数为子弹的颜色;SpannableStringss=newSpannableString(txBullte.getText());ss16.setSpan(newBulletSpan(20,Color.RED),0,txBullte.getText().length(),SPAN_EXCLUSIVE_EXCLUSIVE);txBullte.setText(ss);13、文本的水平和垂直拉伸ScaleXSpan类用于指定水平拉伸的比例。我们传2.5表示横向拉伸是原来的2.5倍;有了水平拉伸,我们自然会想要垂直拉伸,抱歉,不支持因为必须设置垂直高度textSize;SpannableStringss=newSpannableString(txScaleX.getText());ss.setSpan(newScaleXSpan(2.5f),0,txScaleX.getText().length(),SPAN_EXCLUSIVE_EXCLUSIVE);txScaleX.setText(SS);总结EditText显示表情包也是??一个SpannableString,后面我们可以做一个表情包自定义控件;让我们一起学习;本文转载自微信公众号《Android开发编程》
