Android Span应用

来源:互联网 发布:vba抓取网页数据 编辑:程序博客网 时间:2024/06/13 09:38

Android Span应用

Android的Span常被用于完成一些TextView中的特殊内容。

1、SpannableString和SpannableStringBuilder

SpannableString和SpannableStringBuilder都继承了Spannable接口。区别在于SpannableString在初始化内不能改变内容,而SpannableStringBuilder可以。

想要改变内容的格式,需要调用setSpan(Object what, int start, int end, int flags)
what是内容的格式,一般都是CharacterStyle的子类,我们将在下面阐述
start和end定义了内容的范围。
flags表示start和end是开区间还是闭区间,分别是下面四种类型。

  • Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
  • Spanned.SPAN_EXCLUSIVE_INCLUSIVE
  • Spanned.SPAN_INCLUSIVE_EXCLUSIVE
  • Spanned.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前面插入内容,内容颜色是默认的


在5后面插入内容,内容颜色是指定颜色


2、常用的span

(1) ForegroundColorSpan设置文字颜色
ForegroundColorSpan(@ColorInt int color)


(2) BackgroundColorSpan设置背景色
BackgroundColorSpan(int color)


(3) StrikethroughSpan设置删除线
StrikethroughSpan()


(4) UnderlineSpan设置文字下划线。
UnderlineSpan()


(5) URLSpan设置点击文字,可以打开一个URL
URLSpan(String url)

要实现单击事件,必须设置MovementMethod对象
TextView.setMovementMethod(LinkMovementMethod.getInstance()

(6) StyleSpan设置样式
StyleSpan(int style)
style类型有NORMAL、BOLD、ITALIC和BOLD_ITALIC


(7) TypefaceSpan设置字体
TypefaceSpan(String family)
family类型有monospace、serif和sans-serif


(8) SuperscriptSpan设置为上标
SuperscriptSpan()


(9) SubscriptSpan设置为下标
SubscriptSpan()


(10) RelativeSizeSpan设置文字相对大小
RelativeSizeSpan(float proportion)
proportion是大小比例


(11) AbsoluteSizeSpan设置文字绝对大小
public AbsoluteSizeSpan(int size)
public AbsoluteSizeSpan(int size, boolean dip)
size默认是px,dip为true时size为dp,false时为px。


(12) ScaleXSpan设置文字横向缩放
ScaleXSpan(float proportion)
proportion设置缩放比例


(13) ImageSpan设置插入图片
ImageSpan(Context context, Bitmap b)
ImageSpan(Context context, Bitmap b, int verticalAlignment)
ImageSpan(Drawable d)
ImageSpan(Drawable d, int verticalAlignment)
ImageSpan(Context context, Uri uri)
ImageSpan(Context context, Uri uri, int verticalAlignment)
ImageSpan(Context context, @DrawableRes int resourceId)
ImageSpan(Context context, @DrawableRes int resourceId, int verticalAlignment)

verticalAlignment有ALIGN_BOTTOM和ALIGN_BASELINE两种,默认是ALIGN_BOTTOM
Drawable drawable = getResources().getDrawable(R.drawable.star);drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());ImageSpan span = new ImageSpan(drawable);

3、多span应用

多span可以同时作用于文字。
SpannableString ss = new SpannableString("0123456789");ss.setSpan(new RelativeSizeSpan(2), 3, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);ss.setSpan(new URLSpan("tel:1234567890"), 3, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);TextView.setMovementMethod(LinkMovementMethod.getInstance());

4、自定义Span

(1) 修改文字字体
想要修改字体的自定义的span可以在updateDrawState里面修改TextPaint。

例如在ForegroundColorSpan类的updateDrawState方法中,将字体设置为指定颜色。
private final int mColor;public ForegroundColorSpan(@ColorInt int color) {mColor = color;}@Overridepublic void updateDrawState(TextPaint ds) {ds.setColor(mColor);}
(2) 实现点击事件
继承ClickableSpan类,实现onClick方法

public abstract class ClickableSpan extends CharacterStyle {    public abstract void onClick(View widget);}

原创粉丝点击