SpannableString 详解

前言:

        spannableString其实和string一样,textview可以直接通过设置spannablestring来显示文本,只是spannablestring可以显示更多的样式风格。 spannableString和SpannableStringBuilder   一个是一次性的,一个可多次修改。

       SpannableStringBuilder    span= new SpannableStringBuilder("花间一壶酒,独酌无相亲");

        span通过setSpan(object obj,int start ,int end,int flags)来设置;

        obj来设置风格样式,start,end表示下标,

        作用范围end-start;

        flags有四种属性分别如下:

        Spanned.SPAN_EXCLUSIVE_INCLUSIVE: start不包含,end包含

        Spanned.SPAN_EXCLUSIVE_EXCLUSIVE:start,end都不包含

        Spanned.SPAN_INCLUSIVE_EXCLUSIVE:包含start,不包含end

        Spanned.SPAN_INCLUSIVE_INCLUSIVE:包含start,end

   

        flags指的是对所标记前后的文本样式,也就是对新插入的字符是否显示相同样式 。在spannablestring中使用没用处。

        插入的位置必须是start或者end,否则样式也不起作用。

1:背景色和前景色(字体颜色)

   

SpannableString sp1 = new SpannableString("花间一壶酒,独酌无相亲");
//设置文本背景色
sp1.setSpan(new BackgroundColorSpan(Color.parseColor("#ff0000")), 0, sp1.length(), Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
//设置字体颜色
sp1.setSpan(new ForegroundColorSpan(Color.parseColor("#ffffff")), 0, 6, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

2:设置字体大小

    

SpannableString sp2 = new SpannableString("花间一壶酒,独酌无相亲");
sp2.setSpan(new AbsoluteSizeSpan(18), 0, 6, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);//绝对大小
sp2.setSpan(new RelativeSizeSpan(2), 0, sp2.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);//android默认字体大小的倍数

  3:设置字体样式

    

sp2.setSpan(new StyleSpan(Typeface.BOLD), 0, 6, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);//粗体
sp2.setSpan(new StyleSpan(Typeface.ITALIC), 6, sp2.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);//斜体
sp2.setSpan(new UnderlineSpan(), 0, sp2.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);//下划线
sp2.setSpan(new TypefaceSpan("sans-serif"), 0, 6, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
sp2.setSpan(new TypefaceSpan("serif"), 6, sp2.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

4:给部分文字增加点击事件

    用到的是Clickablespan

    

SpannableString sp3 = new SpannableString("君不见黄河之水天上来,奔流到海不复回");
sp3.setSpan(new ClickableSpan() {
    @Override
    public void onClick(View view) {
        Toast.makeText(MainActivity.this, "君不见黄河之水天上来", Toast.LENGTH_LONG).show();
    }
}, 0, 10, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    
textview.setText(sp3);
textview.setMovementMethod(LinkMovementMethod.getInstance());//必须加
5:设置超链接(urlspan)

 
 
SpannableString sp4 = new SpannableString("项目地址,打电话,发短信");
sp4.setSpan(new URLSpan("https://github.com/zhjingjing/SpannerString"), 0, 2, Spanned.SPAN_INCLUSIVE_EXCLUSIVE); //打开网页
sp4.setSpan(new URLSpan("tel:18337104423"), 3, 6, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);//打电话
sp4.setSpan(new URLSpan("smsto:18337104423"), 7, sp4.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);//发短信
textview.setText(sp4);
tv4.setMovementMethod(LinkMovementMethod.getInstance());


6:imagespan

SpannableStringBuilder sp5=new SpannableStringBuilder("关关雎鸠,在河之洲洲");
Drawable drawable = getResources().getDrawable(R.mipmap.image);
drawable.setBounds(0,0,100,100);
sp5.setSpan(new ImageSpan(drawable),sp5.length()-1,sp5.length(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tv5.setText(sp5);






 最后附上地址:      git地址
 

猜你喜欢

转载自blog.csdn.net/qq_23025319/article/details/79608084
今日推荐