强大的SpannableStringBuilder

来源:互联网 发布:php网络验证源码 编辑:程序博客网 时间:2024/04/30 15:28

转载自:http://weixin.niurenqushi.com/article/2016-12-19/4726594.html
不是很全,图片懒得复制了,大家去看原文章吧,我这里是为了以后找到此片文章做一个中转保存
什么都不说,先看个炫酷的效果。
这里写图片描述
‘什么,这也算炫酷?’也许你会这么说

如果我告诉你,这个页面中只用了一个 TextView 呢 ?你没看错!只有一个TextView,没别的!

实现

是时候把 SpannableStringBuilder 介绍给大家了,先看看Google官方的介绍:

This is the class for text whose content and markup can both be changed.(这是一个内容和标记都可以更改的文本类)

不同于我们平时赋值使用的 String、StringBuffer 等,只能给 TextView 设置文本内容,而文本的样式只能用 TextView 来控制,而且该样式的可定制性还不大好。

介绍

SpannableStringBuilder 有个亲兄弟——SpannableString。是不是觉得有点熟悉?似乎看到了 StringBuilder、String 的影子…

是的,SpannableStringBuilder 和 SpannableString 的区别类似与 StringBuilder、String,就是 SpannableStringBuilder 可以拼接,而 SpannableString 不可拼接。

这里写图片描述

由图中可以看出,他们都继承了 CharSequence,因此,他们可以直接在 TextView 的 setText 中使用。

主要方法

SpannableStringBuilder 和 SpannableString 主要通过使用 setSpan(Object what, int start, int end, int flags) 改变文本样式。

对应的参数:

start: 指定Span的开始位置end: 指定Span的结束位置,并不包括这个位置。flags:取值有如下四个:Spannable.SPAN_EXCLUSIVE_INCLUSIVE:在 Span前面输入的字符不应用 Span的效果,在后面输入的字符应用Span效果。Spannable.SPAN_INCLUSIVE_EXCLUSIVE:在 Span前面输入的字符应用 Span 的效果,在后面输入的字符不应用Span效果。Spannable.SPAN_INCUJSIVE_INCLUSIVE:在 Span前后输入的字符都应用 Span 的效果。Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前后都不包括。what: 对应的各种Span,不同的Span对应不同的样式。已知的可用类有:BackgroundColorSpan : 文本背景色ForegroundColorSpan : 文本颜色MaskFilterSpan : 修饰效果,如模糊(BlurMaskFilter)浮雕RasterizerSpan : 光栅效果StrikethroughSpan : 删除线SuggestionSpan : 相当于占位符UnderlineSpan : 下划线AbsoluteSizeSpan : 文本字体(绝对大小)DynamicDrawableSpan : 设置图片,基于文本基线或底部对齐。ImageSpan : 图片RelativeSizeSpan : 相对大小(文本字体)ScaleXSpan : 基于x轴缩放StyleSpan : 字体样式:粗体、斜体等SubscriptSpan : 下标(数学公式会用到)SuperscriptSpan : 上标(数学公式会用到)TextAppearanceSpan : 文本外貌(包括字体、大小、样式和颜色)TypefaceSpan : 文本字体URLSpan : 文本超链接ClickableSpan : 点击事件

用法

SpannableStringBuilder 和 SpannableString 的用法差不多,这边先举一个 SpannableString 的例子。

SpannableString

修改字体颜色:

创建 SpannableString 的时候,传入需要显示的字符串。使用 ForegroundColorSpan 为文字设置颜色,效果:

后面都以 SpannableStringBuilder 为例子。

SpannableStringBuilder

修改字体颜色

这里就可以看出 SpannableStringBuilder 的可拼接性,这里同样采用了 ForegroundColorSpan 为文本设置颜色,效果:

设置背景颜色

使用 BackgroundColorSpan 设置背景颜色,效果:

设置字体大小

使用 AbsoluteSizeSpan 设置字体大小,效果:

设置粗体\斜体

使用 StyleSpan 设置粗体\斜体,从例子中可以看出,多次使用setSpan并不影响,效果:

删除线

StrikethroughSpa 使用 StrikethroughSpan 设置删除线,效果:

下划线

使用 UnderlineSpan 设置下划线,效果:

图片

不仅支持文字样式,还可以插入图片。厉害了我的SpannableStringBuilder~~

使用 ImageSpan 设置图片,将 index 为 6、7 的字符替换成了图片,也就是说,该图片占有 index 6 和 7 的位置,效果:

点击事件

插入图片就已经很变态了,居然还支持点击事件。

使用 ClickableSpan 设置点击事件,最后还需要加上 textView.setMovementMethod(LinkMovementMethod.getInstance());。代码中指定 index 为 5、6、7 的字符都成了可点击的文本,其他区域还是不可点击的,效果:

有同学反映设置部分点击事件后,还需要给整个TextView单独设置点击事件时会出问题。想知道什么问题?自己去试试看,哈哈哈~~

这边有一个我在CSDN上看到的解决方法,可以从另一个角度来解决这个问题:

http://blog.csdn.net/zhaizu/article/details/51038113组合使用

当然,上面的这些用法都能组合使用。来个��

例子中将 ImageSpan、 ClickableSpan、 ForegroundColorSpan、BackgroundColorSpan 进行了组合使用,大家可以根据自己的需求,来随意搭配,效果:(就是刚开始展示的那张gif)

总结

看完后,感觉 SpannableStringBuilder 和 SpannableString 相比 String 要强大太多了。额~~没别的了

源码地址:

https://github.com/Gavin-ZYX/SpannableStringBiulderTest

参考资料:

SpannableString与SpannableStringBuilderhttp://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/1009/3553.htmlAPI 文档https://developer.android.com/reference/android/text/SpannableStringBuilder.htmlSpannableString与SpannableStringBuilderhttp://blog.csdn.net/harvic880925/article/details/38984705
0 0
原创粉丝点击