SpannableString实现同一段文字不同的效果

一、主要功能

通常我们由于各种原因和需求,需要在一个TextView中的文字完成不同的效果,例如部分文字颜色不同、部分文字有点击时间、部分文字大小不同等等,这里推荐一种多功能的String:SpannableString、对应的SpannableStringBuilder和SpannableStringBuffer,以下是可以完成的效果。

  1. BackgroundColorSpan 背景色

  2. ClickableSpan 文本可点击,有点击事件

  3. ForegroundColorSpan 文本颜色(前景色)

  4. MaskFilterSpan 修饰效果,如模糊(BlurMaskFilter)、浮雕(EmbossMaskFilter)

  5. MetricAffectingSpan 父类,一般不用

  6. RasterizerSpan 光栅效果

  7. StrikethroughSpan 删除线(中划线)

  8. SuggestionSpan 相当于占位符

  9. UnderlineSpan 下划线

  10. AbsoluteSizeSpan 绝对大小(文本字体)

  11. DynamicDrawableSpan 设置图片,基于文本基线或底部对齐。

  12. ImageSpan 图片

  13. RelativeSizeSpan 相对大小(文本字体)

  14. ReplacementSpan 父类,一般不用

  15. ScaleXSpan 基于x轴缩放

  16. StyleSpan 字体样式:粗体、斜体等

  17. SubscriptSpan 下标(数学公式会用到)

  18. SuperscriptSpan 上标(数学公式会用到)

  19. TextAppearanceSpan 文本外貌(包括字体、大小、样式和颜色)

  20. TypefaceSpan 文本字体

  21. URLSpan 文本超链接

二、API详解

//初始化字符串
SpannableString span = new SpannableString("测试文字");
//设置特效
span.setSpan(Object spanType, int start, int end, int flags);
//移除特效
span.removeSpan(Object spanType);
//截取字符串
span.subSequence(int start, int end);

其中最重要的是setSpan方法,入参描述如下:

spanType :就是上面所写的21种span

flags: 由四种形式

  • SPAN_INCLUSIVE_EXCLUSIVE:包含start,不包含end

  • SPAN_INCLUSIVE_INCLUSIVE:start,end都包含

  • SPAN_EXCLUSIVE_EXCLUSIVE:start,end都不包含

  • SPAN_EXCLUSIVE_INCLUSIVE:start不包含,end包含

这里flags的作用,在SpannableString里基本没用,但是如果用在SpannableStringBuilder中,则会起作用,比如:

SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder("前面改变后面不变");
//让“改变”两个字变大
spannableStringBuilder.setSpan(new AbsoluteSizeSpan(30, true), 2, 4, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
//在“改”字前加入“a”
spannableStringBuilder.insert(2,"a");

结果是a也会变大,上面的其他类型均同理;

三、实例展示

这里的需求是通过StringBuilder完成部分字体的点击事件和颜色修改,具体实现如下:

效果图

代码块

    //设置颜色不同点击事件位置不同的字符串
    SpannableString spannableString = new SpannableString("点击“确认激活”表示您已阅读并同意《平台用户服务规则》");
    spannableString.setSpan(new ClickableSpan() {
        @Override
        public void onClick(View widget) {
           //点击事件逻辑
        }

        //重写方法去除下划线和改变字体颜色
        @Override
        public void updateDrawState(TextPaint ds) {
            //利用画笔绘制监听文字的颜色
            ds.setColor(Color.parseColor("#ff9900"));
        }

    }, 17, 27, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    //设置点击事件需要配合设置movementMethod,否则点击效果会无效
    textView.setMovementMethod(LinkMovementMethod.getInstance());
    //消除点击时的背景色,原背景色很丑
    textView.setHighlightColor(getResources().getColor(android.R.color.transparent));
    textView.setText(spannableString);
    );

你可能感兴趣的:(Android-UI,AndroidApi)