开发中TextView都是固定了样式,有时候就会要求同一行中显示字体大小,颜色不一样的。这种要求也很简单,用多个TextView就可以了。但是每次这样写会显得很累赘。这时候SpannableStringBuilder就起很大的作用了。
首先看看什么是SpannableStringBuilder?SpannableStringBuilder其实跟String是一样的,但是它拓展性比较强,它能给存储的字符增加各种样式,比如颜色变化,大小,线条等等。用它就可以来做一个富文本显示了。
SpannableStringBuilder设置各种各样的样式是通过setSpan()这个方法来实现的。
/** * Mark the specified range of text with the specified object. * The flags determine how the span will behave when text is * inserted at the start or end of the span's range. */ public void setSpan(Object what, int start, int end, int flags) { setSpan(true, what, start, end, flags, true/*enforceParagraph*/); }
这里的what就是针对各种样式的不同对象了。这里列举一些:
* BackgroundColorSpan : 文本背景色 * ForegroundColorSpan : 文本颜色 * AbsoluteSizeSpan : 文本字体(绝对大小) * RelativeSizeSpan : 相对大小(文本字体) * ImageSpan : 图片 * StrikethroughSpan : 删除线 * ScaleXSpan : 基于x轴缩放 * StyleSpan : 字体样式:粗体、斜体等 * SuggestionSpan : 相当于占位符 * DynamicDrawableSpan : 设置图片,基于文本基线或底部对齐。 * MaskFilterSpan : 修饰效果,如模糊(BlurMaskFilter)浮雕 * UnderlineSpan : 下划线 * RasterizerSpan : 光栅效果 * SubscriptSpan : 下标(数学公式会用到) * SuperscriptSpan : 上标(数学公式会用到) * TextAppearanceSpan : 文本外貌(包括字体、大小、样式和颜色) * TypefaceSpan : 文本字体 * URLSpan : 文本超链接 * ClickableSpan : 点击事件
start 跟 end 就是应用这个span对应的下标,注意应用时时包含start,但是不会包括end。
flags就是一种应用模式:
1.SPAN_EXCLUSIVE_INCLUSIVE:Span前输入的字符不应用 span 效果,Span后输入的字符不应用 span 效果
2.SPAN_INCLUSIVE_EXCLUSIVE:Span前输入的字符应用 span 效果,Span后输入的字符不应用 span 效果
3.SPAN_INCUJSIVE_INCLUSIVE:Span前输入的字符应用 span 效果,Span后输入的字符也应用 span 效果
4.SPAN_EXCLUSIVE_EXCLUSIVE:Span前输入的字符不应用 span 效果,Span后输入的字符也不应用 span 效果
如果是在编辑框Editext上应用span的话,这个flags就会应用上去,如果是一个固定文本的话,无论你选择哪种flags,效果上是一样的,没什么区别。
列举个实战例子:
SpannableStringBuilder builder = new SpannableStringBuilder(); builder.append("哈哈哈哈哈哈哈哈哈哈哈哈哈哈"); ForegroundColorSpan span = new ForegroundColorSpan(Color.GREEN); builder.setSpan(span,2,4,SpannableStringBuilder.SPAN_INCLUSIVE_INCLUSIVE); textView.setText(builder);
运行效果图:
把下标为2,3的文本颜色修改成了绿色了。
以上就是SpannableStringBuilder的基本使用方法了跟介绍了。再也不用为了写个颜色多样的文本而布局多个TextView控件了。最后为了让自己更加方便快捷的使用这个SpannableStringBuilder当然是把它封装成工具类啦。文章就不贴出了,相信大家都会QAQ.