0
点赞
收藏
分享

微信扫一扫

SpannableString与SpannableStringBuilder


文章目录

  • ​​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与SpannableStringBuilder_字体颜色

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

SpannableString与SpannableStringBuilder_字体颜色_02

在指定字符前输入不使用样式
SpannableString与SpannableStringBuilder_字符串_03

各种Span设置

要应用一个Span总共分三步:
1、构造String
2、构造Span
3、利用SetSpan()对指定范围的String应用这个Span

字体颜色设置(ForegroundColorSpan)

SpannableString与SpannableStringBuilder_spannable_04

        //改变字体颜色
//先构造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与SpannableStringBuilder_spannable_05

        SpannableString spannableString = new SpannableString("代码狂欢到深夜");
BackgroundColorSpan backgroundColorSpan = new BackgroundColorSpan(Color.RED);
spannableString.setSpan(backgroundColorSpan,2,4, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);

editText.setText(spannableString);

字体大小(AbsoluteSizeSpan)

SpannableString与SpannableStringBuilder_字符串_06

SpannableString spannableString = new SpannableString("代码狂欢到深夜");
AbsoluteSizeSpan absoluteSizeSpan = new AbsoluteSizeSpan(30);
spannableString.setSpan(absoluteSizeSpan,2,4, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
editText.setText(spannableString);

粗体、斜体(StyleSpan)

SpannableString与SpannableStringBuilder_字符串_07

 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与SpannableStringBuilder_字体颜色_08

SpannableString spannableString = new SpannableString("代码狂欢到深夜");
StrikethroughSpan strikethroughSpan = new StrikethroughSpan();
spannableString.setSpan(strikethroughSpan,2,4, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
editText.setText(spannableString);

下划线(UnderlineSpan)

SpannableString与SpannableStringBuilder_字体颜色_09

SpannableString spannableString = new SpannableString("代码狂欢到深夜");
UnderlineSpan underlineSpan = new UnderlineSpan();
spannableString.setSpan(underlineSpan,2,4, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
editText.setText(spannableString);

图片置换(ImageSpan)

SpannableString与SpannableStringBuilder_字体颜色_10

 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);

举报

相关推荐

【Java】 &&与&和||与|

keepalived与nginx与MySQL

0 条评论