TextView的setText方法需要一个CharSequence对象,而Spannable是CharSequence的子类,而Spannable也是一个接口,所以使用他的子类来设置样式,比较常用的子类是SpannableString和SpannableStringBuilder,而使用这两个类来设置样式其实也比较简单,主要是Spannable的setSpan方法
public void setSpan(Object what, int start, int end, int flags);
第二,第三这两个参数是设置指定的样式在哪个位置,分别表示开始位置和结束位置,要说明的一点是,start是包含当前位置,end是不包含当前位置,这应该大伙们都知道的了,这里主要说说第一个和第四个参数
what
-
TypefaceSpan
这是设置字体样式
在构造方法的注释里有三种样式,monospace,serif和sans-serif
但是中文好像没变化,哈哈哈,英文字母的话还是看得出有不一样的
-
AbsoluteSizeSpan
这是设置字体大小,绝对大小
参入参数就是绝对大小的值
-
RelativeSizeSpan
这是也是设置字体的大小,不过是相对大小
就是传参为2,就是原来的2倍
-
ForegroundColorSpan
字体前景色,也就是字体颜色
参数是颜色值
-
BackgroundColorSpan
字体背景色
参数也是颜色值
-
StyleSpan
字体的样式,例如粗体,斜体
参数是Typeface的常量值NORMAL,BOLD_ITALIC,BOLD和ITALIC
这几个参数很好理解,第一个是默认值,第二个是加粗斜体,第三个是加粗,第四个是斜体
-
UnderlineSpan
加下划线
这里重写updateDrawState方法,根据TextPaint参数可以自己设置是否显示下划线,还有可以设置字体颜色之类的
-
StrikethroughSpan
加删除线
同样重写updateDrawState方法,可以设置的
-
SuperscriptSpan
上标
-
SubscriptSpan
下标
-
ClickableSpan
点击事件
给指定范围的字符设置点击事件
默认的设置完会有下滑线的,如果不想要就重写updateDrawState方法就好了
这里就列举出一部分,还有一部分就不列举了,用法差不多,也可以自定义,继承CharacterStyle类,重写updateDrawState方法,会给一个TextPaint类的对象,而TextPaint继承Paint,画过控件的应该都用过吧,那么剩下的就好办了
flags
- SPAN_INCLUSIVE_EXCLUSIVE
- SPAN_INCLUSIVE_INCLUSIVE
- SPAN_EXCLUSIVE_EXCLUSIVE
- SPAN_EXCLUSIVE_INCLUSIVE
其实这几个都很好理解,可以是这样理解,SPAN-前-后,前是指定范围(start - end)前插入的新字符的设置,后是指定范围后插入的新字符的设置,INCLUSIVE是跟随,EXCLUSICE是不跟随,也就是SPAN_INCLUSIVE_EXCLUSIVE是指在指定范围前插入新字符的话,新字符也会使用指定的样式,而在指定范围后插入新字符则不会,实例看一下
EditText editText = findViewById(R.id.edit);
SpannableString spannableString = new SpannableString("一二三四五");
spannableString.setSpan(new ForegroundColorSpan(Color.RED), 2, 4, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
editText.setText(spannableString);
分别输入了四次,分别是"前","后","更后","更前",但是变色的只有前,由此可见SPAN_INCLUSIVE_EXCLUSIVE的作用,剩下的三个都是一样的用法。
这里参数就介绍完了,但是需要注意的是,setSpan方法的第一个参数,也就是样式,每次都要是新的对象,没用过的,如果是用过的话,就无效的了。那么现在就来看看SpannableString和SpannableStringBuilder的区别。
区别
SpannableString是必须要传入字符才能创建,而SpannableStringBuilder直接创建就可以,当然也可以传入字符,而且SpannableStringBuilder有append,insert,delete等方法,而且传入的是CharSequence,所以就是可以传SpannableString,可控性更好,当然,只操控一条字符,直接使用SpannableString就好了。