天天看点

SpannableString与SpannableStringBuilderSpannableString、SpannableStringBuilder与String的关系SpannableString与SpannableStringBuilder区别SetSpan()

文章目录

  • SpannableString、SpannableStringBuilder与String的关系
  • SpannableString与SpannableStringBuilder区别
  • SetSpan()
    • 函数意义
    • 参数说明
    • 各种Span设置
      • 字体颜色设置(ForegroundColorSpan)
      • 字体背景颜色(BackgroundColorSpan)
      • 字体大小(AbsoluteSizeSpan)
      • 粗体、斜体(StyleSpan)
      • 删除线(StrikethroughSpan)
      • 下划线(UnderlineSpan)
      • 图片置换(ImageSpan)

SpannableString、SpannableStringBuilder与String的关系

首先

SpannableString

SpannableStringBuilder

基本上与

String

差不多,也是用来存储字符串,但它们俩的特殊就在于有一个

SetSpan()

函数,能给这些存储的String添加各种格式或者称样式(Span),将原来的String以不同的样式显示出来

比如在原来String上加下划线、加背景色、改变字体颜色、用图片把指定的文字给替换掉,等等。所以,总而言之,

SpannableString

SpannableStringBuilder

String

一样, 首先也是传字符串,但

SpannableString

SpannableStringBuilder

可以对这些字符串添加额外的样式信息,但

String

则不行

注意:如果这些额外信息能被所用的方式支持,比如将

SpannableString

传给TextView;也有对这些额外信息不支持的,对于不支持的情况,

SpannableString

SpannableStringBuilder

就是退化为

String

类型,直接显示原来的String字符串,而不会再显示这些附加的额外信息

SpannableString与SpannableStringBuilder区别

它们的区别在于

SpannableString

像一个String一样,构造对象的时候传入一个String,之后再无法更改String的内容,也无法拼接多个

SpannableString

;而

SpannableStringBuilder

则更像是

StringBuilder

,它可以通过其

append()

方法来拼接多个String

SpannableString word = new SpannableString("代码狂欢到深夜");
SpannableStringBuilder multiWord = new SpannableStringBuilder();
multiWord.append("代码");
multiWord.append("狂欢");
multiWord.append("到深夜");
           

SetSpan()

void setSpan (Object what, int start, int end, int flags)
           

函数意义

SpannableString

SpannableStringBuilder

特定范围的字符串设定Span样式,可以设置多个(比如同时加上下划线和删除线等),Falg参数标识了当在所标记范围前和标记范围后紧贴着插入新字符时的动作,即是否对新插入的字符应用同样的样式

参数说明

  • object what :对应的各种Span
  • int start:开始应用指定Span的位置,索引从0开始
  • int end:结束应用指定Span的位置,特效并不包括这个位置。比如如果这里数为3(即第4个字符),第4个字符不会有任何特效
  • int flags:取值有如下四个

    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE

    :前后都不包括,即在指定范围的前面和后面插入新字符都不会应用新样式

    Spannable.SPAN_EXCLUSIVE_INCLUSIVE

    :前面不包括,后面包括。即仅在范围字符的后面插入新字符时会应用新样式

    Spannable.SPAN_INCLUSIVE_EXCLUSIVE

    :前面包括,后面不包括

    Spannable.SPAN_INCLUSIVE_INCLUSIVE

    :前后都包括

例子

xml代码

<EditText
        android:id="@+id/edit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
           

java代码

public class MainActivity extends AppCompatActivity {
    EditText editText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editText = (EditText) findViewById(R.id.edit);
        //改变字体颜色
        //先构造SpannableString
        SpannableString spannableString = new SpannableString("代码狂欢到深夜");
        //再构造一个改变字体颜色的Span
        ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.RED);
        //将这个Span应用于指定范围的字体
        spannableString.setSpan(foregroundColorSpan,2,4, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);

        editText.setText(spannableString);
    }
}
           

效果

SpannableString与SpannableStringBuilderSpannableString、SpannableStringBuilder与String的关系SpannableString与SpannableStringBuilder区别SetSpan()

在指定字符后输入后使用样式

SpannableString与SpannableStringBuilderSpannableString、SpannableStringBuilder与String的关系SpannableString与SpannableStringBuilder区别SetSpan()

在指定字符前输入不使用样式

SpannableString与SpannableStringBuilderSpannableString、SpannableStringBuilder与String的关系SpannableString与SpannableStringBuilder区别SetSpan()

各种Span设置

要应用一个Span总共分三步:

1、构造String

2、构造Span

3、利用SetSpan()对指定范围的String应用这个Span

字体颜色设置(ForegroundColorSpan)

SpannableString与SpannableStringBuilderSpannableString、SpannableStringBuilder与String的关系SpannableString与SpannableStringBuilder区别SetSpan()
//改变字体颜色
        //先构造SpannableString
        SpannableString spannableString = new SpannableString("代码狂欢到深夜");
        //再构造一个改变字体颜色的Span
        ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.RED);
        //将这个Span应用于指定范围的字体
        spannableString.setSpan(foregroundColorSpan,2,4, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);

        editText.setText(spannableString);
           

字体背景颜色(BackgroundColorSpan)

SpannableString与SpannableStringBuilderSpannableString、SpannableStringBuilder与String的关系SpannableString与SpannableStringBuilder区别SetSpan()
SpannableString spannableString = new SpannableString("代码狂欢到深夜");
        BackgroundColorSpan backgroundColorSpan = new BackgroundColorSpan(Color.RED);
        spannableString.setSpan(backgroundColorSpan,2,4, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);

        editText.setText(spannableString);
           

字体大小(AbsoluteSizeSpan)

SpannableString与SpannableStringBuilderSpannableString、SpannableStringBuilder与String的关系SpannableString与SpannableStringBuilder区别SetSpan()
SpannableString spannableString = new SpannableString("代码狂欢到深夜");
        AbsoluteSizeSpan absoluteSizeSpan = new AbsoluteSizeSpan(30);
        spannableString.setSpan(absoluteSizeSpan,2,4, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
        editText.setText(spannableString);
           

粗体、斜体(StyleSpan)

SpannableString与SpannableStringBuilderSpannableString、SpannableStringBuilder与String的关系SpannableString与SpannableStringBuilder区别SetSpan()
SpannableString spannableString = new SpannableString("代码狂欢到深夜");
        StyleSpan styleSpan = new StyleSpan(Typeface.BOLD_ITALIC);
        spannableString.setSpan(styleSpan,2,4, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
        editText.setText(spannableString);
           

删除线(StrikethroughSpan)

SpannableString与SpannableStringBuilderSpannableString、SpannableStringBuilder与String的关系SpannableString与SpannableStringBuilder区别SetSpan()
SpannableString spannableString = new SpannableString("代码狂欢到深夜");
        StrikethroughSpan strikethroughSpan = new StrikethroughSpan();
        spannableString.setSpan(strikethroughSpan,2,4, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
        editText.setText(spannableString);
           

下划线(UnderlineSpan)

SpannableString与SpannableStringBuilderSpannableString、SpannableStringBuilder与String的关系SpannableString与SpannableStringBuilder区别SetSpan()
SpannableString spannableString = new SpannableString("代码狂欢到深夜");
        UnderlineSpan underlineSpan = new UnderlineSpan();
        spannableString.setSpan(underlineSpan,2,4, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
        editText.setText(spannableString);
           

图片置换(ImageSpan)

SpannableString与SpannableStringBuilderSpannableString、SpannableStringBuilder与String的关系SpannableString与SpannableStringBuilder区别SetSpan()
SpannableString spannableString = new SpannableString("代码狂欢到深夜");
        Drawable d = getResources().getDrawable(R.drawable.heart);
        d.setBounds(0,0,d.getIntrinsicWidth(),d.getIntrinsicHeight());
        ImageSpan imageSpan = new ImageSpan(d,ImageSpan.ALIGN_BASELINE);
        spannableString.setSpan(imageSpan,2,4, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
        editText.setText(spannableString);
           
总结自:启航大神的博客http://blog.csdn.net/harvic880925/article/details/38984705

继续阅读