1. SpannableString类
SpannableString
和SpannableStringBuilder
都继承了Spannable
接口。区别在于SpannableString
在初始化后不能改变内容,而SpannableStringBuilder
可以。
使用setSpan(Object what, int start, int end, int flags)
方法来设置样式。
what
:对应的各种Span
,继承CharacterStyle
。start
:开始应用指定Span
的位置,索引从0开始。end
:结束应用指定Span
的位置。flags
:取值有如下四个Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
:前后都不包括,即在指定范围的前面和后面插入新字符都不会应用新样式Spannable.SPAN_EXCLUSIVE_INCLUSIVE
:前面不包括,后面包括。即仅在范围字符的后面插入新字符时会应用新样式Spannable.SPAN_INCLUSIVE_EXCLUSIVE
:前面包括,后面不包括。Spannable.SPAN_INCLUSIVE_INCLUSIVE
:前后都包括。
对于TextView
来说这四种类型没有区别,在EditText
中,改变内容将看到效果。例如我们设置EditText
内容的颜色,并进行修改。
SpannableString ss = new SpannableString("0123456789");
ss.setSpan(new ForegroundColorSpan(Color.RED), 3, 5, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
EditText.setText(ss);
在3前面插入内容,内容颜色是默认的
在4后面插入内容,内容颜色是指定颜色
2. 常用的span
ForegroundColorSpan
设置文字颜色。BackgroundColorSpan
设置背景色。StrikethroughSpan
设置删除线。UnderlineSpan
设置文字下划线。URLSpan
设置点击文字,可以打开一个URL
,要实现单击事件,必须设置MovementMethod
对象。StyleSpan
设置样式,类型有NORMAL
、BOLD
、ITALIC
和BOLD_ITALIC
。TypefaceSpan
设置字体,类型有monospace
、serif
和sans-serif
。SuperscriptSpan
设置为上标。SubscriptSpan
设置为下标。RelativeSizeSpan
设置文字相对大小,RelativeSizeSpan(float proportion)
里面proportion
是大小比例。AbsoluteSizeSpan
设置文字绝对大小,AbsoluteSizeSpan(int size, boolean dip)
里面,size
默认是px
,dip
为true
时size
为dp
,false
时为px
。ScaleXSpan
设置文字横向缩放,ScaleXSpan(float proportion)
里面proportion
设置缩放比例。ImageSpan
设置插入图片,ImageSpan(Drawable d, int verticalAlignment)
里面verticalAlignment
有ALIGN_BOTTOM
和ALIGN_BASELINE
两种,默认是ALIGN_BOTTOM
。
Drawable drawable = getResources().getDrawable(R.drawable.small);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight());
ImageSpan span = new ImageSpan(drawable);
多个Span
可作用于同一个字符串上。
SpannableString ss = new SpannableString("0123456789");
ss.setSpan(new RelativeSizeSpan(2), 3, 8, 0);
ss.setSpan(new ForegroundColorSpan(Color.RED), 3, 8, 0);
((TextView) findViewById(R.id.tv14)).setText(ss);
效果如下
3. 自定义Span
所有的Span
都继承CharacterStyle
,重写了updateDrawState()
方法。例如ForegroundColorSpan
和BackgroundColorSpan
中,都在updateDrawState()
方法里面修改了TextPaint
的属性。
public class ForegroundColorSpan extends CharacterStyle {
@Override
public void updateDrawState(TextPaint ds) {
ds.setColor(mColor);
}
}
public class BackgroundColorSpan extends CharacterStyle {
@Override
public void updateDrawState(TextPaint ds) {
ds.bgColor = mColor;
}
}
因此,如果我们自定义一个样式,只需要修改updateDrawState()
方法。
SpannableString ss = new SpannableString("点击我");
ss.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(SpannableActivity.this, "onClick",
Toast.LENGTH_LONG).show();
}
@Override
public void updateDrawState(TextPaint ds) {
ds.setColor(ds.linkColor);
}
}, 0, 3, 0);
tv.setText(ss);
// 点击事件,需要setMovementMethod
tv.setMovementMethod(LinkMovementMethod.getInstance());
相关文章
Android TextView控件
Android Span应用
Android ParagraphStyle应用
Android EditText控件
Android 监听软键盘显示和隐藏