近几年来,网络直播可以说是非常火热。网红也是遍地花开,其中不少主播在 PC 端做直播,也有很多主播用手机来直播。主播和观众经常需要互动交流,所以文字交流必不可少。在公司的 APP 中有类似如下图的聊天文字效果。一条聊天信息中,发送者名字的颜色是会随机改变,而内容信息是固定一个颜色。
你认为先实现这方法很简单,使用两个 TextView 控件就可以搞定完事。左边的 TextView 放置名字,右边的 TextView 放置内容。这种方法是可以实现,那有没有更好的方法呢?答案是肯定的。本文的主角就是 SpannableString 。
1
介绍 SpannableString
SpannableString 继承于 SpannableStringInternal,同时实现了 CharSequence, GetChars, Spannable 这几个接口。它的作用是能够改变字符串的字体颜色,设置字符串的字体样式,为字符串添加下划线等。
2
使用 SpannableString
SpannableString 用法可以分为三部走: 首先实例化一个 SpannableString 对象,然后为其设置样式,最后将 spanStirng 填充到 TextView 中。具体可以看下面的代码:
spanString 最主要也是我们最常用的方法 setSpan(Object what, int start, int end, int flags)。它需要传入四个参数,这四个参数作用的分别是:
what
为想要设置的样式类。
start
为样式生效的起始位置。因为 SpannableString 是实现了 CharSequence 接口,所以是按照字符来计算的。
end
为样式生效的结束位置。
flags
为标记,标记样式生效的范围。
what 有以下这些类:
样式类 | 效果说明 |
---|---|
ForegroundColorSpan | 文本颜色(前景色) |
BackgroundColorSpan | 背景色 |
ClickableSpan | 设置文本可点击 |
DynamicDrawableSpan | 设置图片,基于文本基线或底部对齐 |
MaskFilterSpan | 修饰效果,如模糊(BlurMaskFilter)、浮雕(EmbossMaskFilter) |
MetricAffectingSpan | 父类,一般不用 |
RasterizerSpan | 光栅效果 |
StrikethroughSpan | 删除线(中划线) |
SuggestionSpan | 相当于占位符 |
UnderlineSpan | 下划线 |
AbsoluteSizeSpan | 绝对大小(文本字体) |
ImageSpan | 图片 |
RelativeSizeSpan | 相对大小(文本字体) |
ReplacementSpan | 父类,一般不用 |
ScaleXSpan | 基于 x 轴缩放 |
StyleSpan | 字体样式:粗体、斜体等 |
SubscriptSpan | 下标(数学公式会用到) |
SuperscriptSpan | 上标(数学公式会用到) |
TextAppearanceSpan | 文本外貌(包括字体、大小、样式和颜色) |
TypefaceSpan | 文本字体 |
URLSpan | 文本超链接 |
flags 也有四个参数,分别是:
1) Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
:前后都不包括,即在指定范围的前面和后面插入新字符都不会应用新样式
2) Spannable.SPAN_EXCLUSIVE_INCLUSIVE
:前面不包括,后面包括。即仅在范围字符的后面插入新字符时会应用新样式
3) Spannable.SPAN_INCLUSIVE_EXCLUSIVE
:前面包括,后面不包括。
4) Spannable.SPAN_INCLUSIVE_INCLUSIVE
:前后都包括。
3
代码实现
这么多消息,当然需要一个列表来呈现。我选择 RecycleView 来显示数据,它的 item 布局中放置一个 TextView。
在 Adapter 的绑定视图的方法中,使用 SpannableString 为要显示的字符串设置效果
小贴士
因微信不支持站内链接, 请点击【阅读原文】阅读完整的代码
作者:猴哥,公众号:极客猴。爱好读书,喜欢钻研技术,梦想成为文艺青年的IT Boy。
- END -