SpannableStringBuilder 笔

TextView官方加强版

0.介绍

  • SpannableStringBuilder
    可以拼接
  • SpannableString
    不可拼接

1.方法

改变文本样式
setSpan(Object what, int start, int end, int flags)

  • start:开始位置
  • end:结束位置,并不包括这个位置。
  • flags:取值有如下四个
  • Spannable.SPAN_EXCLUSIVE_INCLUSIVE:前面不应用效果,后面应用效果。
  • Spannable.SPAN_INCLUSIVE_EXCLUSIVE:前面应用效果,后面不应用效果。
  • Spannable.SPAN_INCUJSIVE_INCLUSIVE:前后应用效果。
  • Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前后都不包括。
  • what: 对应的各种Span,不同的Span对应不同的样式。已知的可用类有
  • BackgroundColorSpan : 文本背景色
  • ForegroundColorSpan : 文本颜色
  • MaskFilterSpan : 修饰效果,如模糊(BlurMaskFilter)浮雕
  • RasterizerSpan : 光栅效果
  • StrikethroughSpan : 删除线
  • SuggestionSpan : 相当于占位符
  • UnderlineSpan : 下划线
  • AbsoluteSizeSpan : 文本字体(绝对大小)
  • DynamicDrawableSpan : 设置图片,基于文本基线或底部对齐。
  • ImageSpan : 图片
  • RelativeSizeSpan : 相对大小(文本字体)
  • ScaleXSpan : 基于x轴缩放
  • StyleSpan : 字体样式:粗体、斜体等
  • SubscriptSpan : 下标(数学公式会用到)
  • SuperscriptSpan : 上标(数学公式会用到)
  • TextAppearanceSpan : 文本外貌(包括字体、大小、样式和颜色)
  • TypefaceSpan : 文本字体
  • URLSpan : 文本超链接
  • ClickableSpan : 点击事件

3.使用实战

1.TextView 超链接布局

drawabletv_link_selector.xml

<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:color="#ffffff"/>
    <item android:color="#FF364A61"/>
</selector>
2.TextView 布局
<TextView
    android:id="@+id/tv1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColorLink="@drawable/tv_link_selector"
    android:textSize="18dp"/>
3.calss代码
/**
 * 大体功能测试
 */
private void test() {
    SpannableStringBuilder spsb = new SpannableStringBuilder("字体颜色。");
    spsb.append("爷是有背景的人。");
    spsb.append("爷说字体要大。");
    spsb.append("爷要粗!");
    spsb.append("葛优瘫了。");
    spsb.append("加粗版的葛优瘫。");
    spsb.append("加条删除线吧。");
    spsb.append("来条下划线。");
    spsb.append("图片");
    spsb.append("有本事点我试试。");

    // 设置--字体颜色
    ForegroundColorSpan colorSpan = new ForegroundColorSpan(Color.parseColor("#009ad6"));
    spsb.setSpan(colorSpan, 0, 5, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);

    // 设置--背景颜色
    BackgroundColorSpan bgColorSpan = new BackgroundColorSpan(Color.parseColor("#009ad6"));
    spsb.setSpan(bgColorSpan, 5, 13, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);

    // 设置--字体大小
    AbsoluteSizeSpan absoluteSizeSpan = new AbsoluteSizeSpan(50);
    spsb.setSpan(absoluteSizeSpan, 13, 20, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);

    // 设置--粗体
    StyleSpan styleSpan = new StyleSpan(Typeface.BOLD);
    spsb.setSpan(styleSpan, 20, 24, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);

    // 设置--斜体
    StyleSpan styleSpan2 = new StyleSpan(Typeface.ITALIC);
    spsb.setSpan(styleSpan2, 24, 29, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);

    // 设置--粗斜体
    StyleSpan styleSpan3 = new StyleSpan(Typeface.BOLD_ITALIC);
    spsb.setSpan(styleSpan3, 29, 37, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);

    // 设置--删除线
    StrikethroughSpan strikethroughSpan = new StrikethroughSpan();
    spsb.setSpan(strikethroughSpan, 37, 44, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);

    // 设置--下划线
    UnderlineSpan underlineSpan = new UnderlineSpan();
    spsb.setSpan(underlineSpan, 44, 50, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);

    // 设置--图片
    ImageSpan imageSpan = new ImageSpan(this, R.mipmap.ic_launcher);
    //也可以这样
    //Drawable drawable = getResources().getDrawable(R.mipmap.ic_launcher);
    //drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
    //ImageSpan imageSpan1 = new ImageSpan(drawable);
    //将index为50-52的字符用图片替代
    spsb.setSpan(imageSpan, 50, 52, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);

    // 设置--点击事件
    ClickableSpan cs = new ClickableSpan() {
        @Override
        public void onClick(View view) {
            Toast.makeText(MainActivity.this, "安倍这老狗。", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void updateDrawState(TextPaint ds) {
            // 超链接的文本颜色
            ds.setColor(Color.parseColor("#009ad6"));
            // 是否显示下划线
            ds.setUnderlineText(false);
            ds.clearShadowLayer();
        }
    };
    spsb.setSpan(cs, 52, 60, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);

    tv1.setText(spsb);
    // 设置--点击事件(相关)
    tv1.setMovementMethod(LinkMovementMethod.getInstance());
}

2017-1-5 15:15:49

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容