TextView在Android中几乎是再常见不过的控件了,几乎遍布在各个角落里,对TextView并没有什么技术点来做分析,但是有时候可能会需要你在项目中处理一些特殊字体,比如下划线,横穿线,亦或者是为TextView部分字体设置点击或者颜色背景等等,这点需求虽然不是什么难事,但是选不好解决方法真的会可能会让你折腾好久。说了这么多无非就是开篇引个题,下面为大家介绍SpanableString哈。
里面需要具体分析的技术点并不是太多,我先给大家贴上源码,看看google是怎么定义这么一个东东的。
-
/**
-
* This is the class for text whose content is immutable but to which
-
* markup objects can be attached and detached.
-
* For mutable text, see {@link SpannableStringBuilder}.
-
*/
上面这段内容摘自安卓SpanableString源码里面的注释,大体意思就是说
这是一个内容和标记都可以更改的文本类
其实源码内容并不是太多,感兴趣的话可以去查看下源码
源码关键的两个方法
-
public void setSpan(Object what, int start, int end, int flags) {}
-
public void removeSpan(Object what) {}
我先带大家简单使用下这个控件,然后在来分析,其实说到这里有一个小细节开篇的时候忘记跟大家提起了,就是看到SpanableString,其实还有SpanableStringBuilder,其用法类似,大家可以类比String跟StringBuilder来区别,我在此不多解释了,就像你会有String肯定也会使用StringBuilder,我就不在做重复的解释了,下面先来具体举个例子带大家认识下这个东东。
-
SpannableString spannableString = new SpannableString("转点软件技术工作室技术分享专题");
-
ForegroundColorSpan colorSpan = new ForegroundColorSpan(Color.parseColor("#009ad6"));
-
spannableString.setSpan(colorSpan, 0, 3, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
-
((TextView)findViewById(R.id.mode1)).setText(spannableString);
通过上述代码就可以实现开篇提到的给部分字体设置颜色的效果,那趁着大家现在对SpanableString有个大概的认识之后我先简单分析下流程,然后再把其他使用方法给大家总结下。
我个人是吧SpanableString理解成一个特殊的字符串,不同于String的是他可以在上面做出一些花哨的东西,示例代码中分四步完成了这一操作。
1.先是new出一个SpanableString对象,并为其初始化一个字符串,
2.然后通过span的方式生成一个colorSpan对象,这里的span可以设置成其他任何你想设置的形式,比如开篇提到的下划线或者上划线,点击事件都可以,对应于不同的span对象,稍后我整理给大家。
3.为SpanableString设置span。setSpan的四个参数稍后我结合源码分析给大家。
4.为textView设置特殊样式的字体。
具体分析:
从上面的步骤中大家也看出了,其实设置特殊样式的关键步骤在第2步,下面我先为大家整理里具体都可以设置那些特殊样式:
常用到的Span大致如下
BackgroundColorSpan
: 文本背景色
ForegroundColorSpan
: 文本颜色
MaskFilterSpan
: 修饰效果,如模糊(BlurMaskFilter)浮雕
RasterizerSpan
: 光栅效果
StrikethroughSpan
: 删除线
SuggestionSpan
: 相当于占位符
UnderlineSpan
: 下划线
AbsoluteSizeSpan
: 文本字体(绝对大小)
DynamicDrawableSpan
: 设置图片,基于文本基线或底部对齐。
ImageSpan
: 图片
RelativeSizeSpan
: 相对大小(文本字体)
ScaleXSpan
: 基于x轴缩放
StyleSpan
: 字体样式:粗体、斜体等
SubscriptSpan
: 下标(数学公式会用到)
SuperscriptSpan
: 上标(数学公式会用到)
TextAppearanceSpan
: 文本外貌(包括字体、大小、样式和颜色)
TypefaceSpan
: 文本字体
URLSpan
: 文本超链接
ClickableSpan
: 点击事件
其用法大家可以套用示例代码中的样子,无非是具体的Span类型不同,用法一致。
现在我解释刚刚在第三步中说到的setSpan的用法,以及4个参数具体代表的含义,先给大家贴上setSpan的源码。
-
public void setSpan(Object what, int start, int end, int flags) {
-
super.setSpan(what, start, end, flags);
-
}
上述源码是我直接从SpanableString类中摘取出来的,
第一个参数 Object what:这个what就是上面分享的各种Span的类型,大家根据需要自己指定。
第二个第三个参数 int start int end:这两个参数是Span开始跟结束的位置。
第四个参数: int flag 参数用4中类型,分别代表的意思为span开始结束的位置包含或者不包含start 、end,
flags的取值如下:
Spannable. SPAN_INCLUSIVE_EXCLUSIVE
:前面包括,后面不包括,即在文本前插入新的文本会应用该样式,而在文本后插入新文本不会应用该样式
Spannable. SPAN_INCLUSIVE_INCLUSIVE
:前面包括,后面包括,即在文本前插入新的文本会应用该样式,而在文本后插入新文本也会应用该样式
Spannable. SPAN_EXCLUSIVE_EXCLUSIVE
:前面不包括,后面不包括
Spannable. SPAN_EXCLUSIVE_INCLUSIVE
:前面不包括,后面包括
好了,看到这里我想你应该已经掌握了具体怎么设置特殊并且花哨的textview了,其他各种Span的设置,代码大同小异我就不重复贴代码带大家演示了,有一个小细节需要大家注意下,我贴上代码算是提醒下大家吧,在设置ClickableSpan的时候千万别忘了setMovementMethod。示例代码如下:
-
SpannableString spannableString = new SpannableString("转点软件技术工作室技术分享");
-
ClickableSpan clickableSpan = new ClickableSpan() {
-
@Override
-
public void onClick(View widget) {
-
//TODO 点击事件在此处理
-
System.out.println("转点软件被点击了.....");
-
}
-
};
-
spannableString.setSpan(clickableSpan,0,3, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
-
textView.setText(spannableString);
-
textView.setMovementMethod(LinkMovementMethod.getInstance()); //为TextView设置完Span后,别忘了setMovementMethod