Spannable设置TextView样式

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);
Spannable设置TextView样式_第1张图片
输入前
Spannable设置TextView样式_第2张图片
输入后

分别输入了四次,分别是"前","后","更后","更前",但是变色的只有前,由此可见SPAN_INCLUSIVE_EXCLUSIVE的作用,剩下的三个都是一样的用法。

这里参数就介绍完了,但是需要注意的是,setSpan方法的第一个参数,也就是样式,每次都要是新的对象,没用过的,如果是用过的话,就无效的了。那么现在就来看看SpannableString和SpannableStringBuilder的区别。

区别

SpannableString是必须要传入字符才能创建,而SpannableStringBuilder直接创建就可以,当然也可以传入字符,而且SpannableStringBuilder有append,insert,delete等方法,而且传入的是CharSequence,所以就是可以传SpannableString,可控性更好,当然,只操控一条字符,直接使用SpannableString就好了。

你可能感兴趣的:(Spannable设置TextView样式)