分享

强大的SpannableStringBuilder

 个人文档awpyia 2017-05-10

今日科技快讯
作者简介

大家好,又是新的一周!今天给大家带来 带心情去旅行 的投稿,分析了  SpannableStringBuilder 的一些用法。希望能帮助到大家!

带心情去旅行 的博客地址:

http://www.jianshu.com/users/769d3d3a9d4b

效果

什么都不说,先看个炫酷的效果。

‘什么,这也算炫酷?’也许你会这么说

如果我告诉你,这个页面中只用了一个 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与SpannableStringBuilder

http://www./a/anzhuokaifa/androidkaifa/2015/1009/3553.html

API 文档

https://developer./reference/android/text/SpannableStringBuilder.html

SpannableString与SpannableStringBuilder

http://blog.csdn.net/harvic880925/article/details/38984705

更多

每天学习累了,看些搞笑的段子放松一下吧。关注最具娱乐精神的公众号,每天都有好心情。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多