最近开发类似微信朋友圈的点赞列表,每一个用户名称一个类似超级链接的形式,中间用逗号分割,而且用户名还需要点击事件。第一时间想到的当然是使用Textview
,如果用多个Textview
排列起来,做起来会很臃肿。那么如何实现呢?
使用SpannableString和SpannableStringBuilder
其实使用SpannableString
和SpannableStringBuilder
一个Textview
就可以实现这样的需求。
我们知道使用textview.setText("12345678字符串")
可以设置文本,但这个方法的参数类型不是String
,而是一个接口CharSequence
,当然String
是实现了这个接口的,所以可以传入。
同样SpannableString
和SpannableStringBuilder
也是实现了CharSequence
接口,所以我们可以使用这两个对象代替String
。
构建SpannableString
SpannableString spannableString = new SpannableString("12345678字符串");//new
textview.setText(spannableString);//使用
上面代码和textview.setText("12345678字符串")
效果是一样的。
SpannableString
的强大之处在于可以设置span
,span
意思就是在字符串的一定区域显示不同的效果,如字体颜色、背景颜色、点击时间、下划线、字体大小等等等等。。。,以下代码设置字符串‘12345’
的背景颜色为#cccccc
,而且具有点击事件
//点击效果
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View widget) {
//这里处理点击事件
}
};
//背景颜色
BackgroundColorSpan bs =new BackgroundColorSpan(Color.parseColor("#CCCCCC");
//下面两个效果的叠加的,不回覆盖
spannableString.setSpan(clickableSpan,0,4,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(bs,0,4,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textview.setText(spannableString);
//加上这句才会有点击响应。。
textview.setMovementMethod(LinkMovementMethod.getInstance());
setSpan的参数:setSpan(Object what, int start, int end, int flags)
,其中flags可以是以下的值:
-
Spanned.SPAN_EXCLUSIVE_INCLUSIVE
:在 Span前面输入的字符不应用 Span的效果,在后面输入的字符应用Span效果。 -
Spanned.SPAN_INCLUSIVE_EXCLUSIVE
:在 Span前面输入的字符应用 Span 的效果,在后面输入的字符不应用Span效果。 -
Spanned.SPAN_INCUJSIVE_INCLUSIVE
:在 Span前后输入的字符都应用 Span 的效果。
setSpan
方法设置一个span对象,它的参数类型是Object
,已知可用的类有:
类/接口名 | 说明 |
---|---|
BackgroundColorSpan | 背景色 |
ClickableSpan | 文本可点击,有点击事件 |
ForegroundColorSpan | 文本颜色(前景色) |
MaskFilterSpan | 修饰效果,如模糊(BlurMaskFilter)浮雕 |
(EmbossMaskFilter)MetricAffectingSpan | 父类,一般不用 |
RasterizerSpan | 光栅效果 |
StrikethroughSpan | 删除线(中划线) |
SuggestionSpan | 相当于占位符 |
UnderlineSpan | 下划线 |
AbsoluteSizeSpan | 绝对大小(文本字体) |
DynamicDrawableSpan | 设置图片,基于文本基线或底部对齐。 |
ImageSpan | 图片 |
RelativeSizeSpan | 相对大小(文本字体) |
ReplacementSpan | 父类,一般不用 |
ScaleXSpan | 基于x轴缩放 |
StyleSpan | 字体样式:粗体、斜体等 |
SubscriptSpan | 下标(数学公式会用到) |
SuperscriptSpan | 上标(数学公式会用到) |
TextAppearanceSpan | 文本外貌(包括字体、大小、样式和颜色) |
TypefaceSpan | 文本字体 |
URLSpan | 文本超链接 |
怎么使用可以一个个试过去
SpannableString和SpannableStringBuilder的关系
有点类似与String
和StringBuilder
SpannableString
是不可变长度的
SpannableStringBuilder
是可变长度的
用法上都差不多,复杂效果组合使用更加方便快捷,它们可以这样组合:
SpannableStringBuilder ssb = new SpannableStringBuilder("嘿嘿");
SpannableString ss1 = new SpannableString("①号");
SpannableString ss2 = new SpannableString("②号");
ssb.append(ss1);
ssb.append(ss2);
ssb.append("也可以是字符串");
网友评论