欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android开发中SpannableString的富文本显示效果代码实现

程序员文章站 2022-05-01 19:09:50
1.简介 settext(charsequence text)中接收的是charsequence。而spannablestring和spannablestringbuilder是其实现类,是可以直接...

1.简介

settext(charsequence text)中接收的是charsequence。而spannablestring和spannablestringbuilder是其实现类,是可以直接赋值的。并且两者的setspan()方法可以设置一些格式对象(例如字体大小、下划线、替换为图片等),这就可以实现富文本了。

spannable实现子类:spannablestring,spannablestringbuilder(可变,类似于stringbuilder)。

spannable中定义了抽象方法:setspan(object what, int start, int end, int flags)和removespan(object what)。这两个方法实现了对字符串的灵活编辑。

其中setspan()方法包含如下参数:

参数 参数说明
what span样式
start 样式开始的索引
end 样式结束的索引
flags 样式作用的范围

flags常用的有四种

span_inclusive_inclusive 前后都包括,在指定范围前后插入新字符,都会应用新样式
span_exclusive_exclusive 前后都不包括,在指定范围前后插入新字符,两端样式无变化
span_inclusive_exclusive 前面包括,后面不包括
span_exclusive_inclusive 后面包括,前面不包括

通常在insert方式才生效,平时不生效,具体看:explain the meaning of span flags like span_exclusive_exclusive。

2.常用span类

常用类 说明
backgroundcolorspan 背景色样式,显然可以用来设定文本的背景色
foregroundcolorspan 字体颜色样式,用于改变字体颜色
stylespan 主要由正常、粗体、斜体和同时加粗倾斜四种样式
typefacespan 设置不同的字体
imagespan 图片样式,主要用于在文本中插入图片
urlspan 可以打开一个链接
underlinespan 下划线样式
strikethroughspan 删除线样式

spannablestring其实和string一样,都是一种字符串类型,spannablestring可以直接作为textview的显示文本,不同的是spannablestring可以通过使用其方法setspan方法实现字符串各种形式风格的显示,重要的是可以指定设置的区间,也就是为字符串指定下标区间内的子字符串设置格式。

setspan(object what, int start, int end, int flags)方法需要用户输入四个参数,what表示设置的格式是什么,可以是前景色、背景色也可以是可点击的文本等等,start表示需要设置格式的子字符串的起始下标,同理end表示终了下标,flags属性就有意思了,共有四种属性:

spanned.span_inclusive_exclusive从起始下标到终了下标,包括起始下标

spanned.span_inclusive_inclusive从起始下标到终了下标,同时包括起始下标和终了下标

spanned.span_exclusive_exclusive从起始下标到终了下标,但都不包括起始下标和终了下标

spanned.span_exclusive_inclusive从起始下标到终了下标,包括终了下标

spannablestring的setspan()方法可以同时使用多个,实现多种效果叠加。

下面我们一一解读几种span常用的格式:

foregroundcolorspanAndroid开发中SpannableString的富文本显示效果代码实现

foregroundcolorspan,为文本设置前景色,效果和textview的settextcolor()类似,实现方法如下:

spannablestring spannablestring = new spannablestring("设置文字的前景色为淡蓝色");
foregroundcolorspan colorspan = new foregroundcolorspan(color.parsecolor("#0099ee"));
spannablestring.setspan(colorspan, 9, spannablestring.length(), spanned.span_inclusive_exclusive); 
textview.settext(spannablestring);

设置的区间是9到字符串的最后,也就是图中“淡蓝色”三字。

backgroundcolorspanAndroid开发中SpannableString的富文本显示效果代码实现

backgroundcolorspan,为文本设置背景色,效果和textview的setbackground()类,实现方法如下:

spannablestring spannablestring = new spannablestring("设置文字的背景色为淡绿色");
backgroundcolorspan colorspan = new backgroundcolorspan(color.parsecolor("#ac00ff30"));
spannablestring.setspan(colorspan, 9, spannablestring.length(), spanned.span_inclusive_exclusive);
textview.settext(spannablestring);

relativesizespan

Android开发中SpannableString的富文本显示效果代码实现

relativesizespan,设置文字相对大小,在textview原有的文字大小的基础上,相对设置文字大小,实现方法如下:

spannablestring spannablestring = new spannablestring("万丈高楼平地起");

relativesizespan sizespan01 = new relativesizespan(1.2f);
relativesizespan sizespan02 = new relativesizespan(1.4f);
relativesizespan sizespan03 = new relativesizespan(1.6f);
relativesizespan sizespan04 = new relativesizespan(1.8f);
relativesizespan sizespan05 = new relativesizespan(1.6f);
relativesizespan sizespan06 = new relativesizespan(1.4f);
relativesizespan sizespan07 = new relativesizespan(1.2f);

spannablestring.setspan(sizespan01, 0, 1, spanned.span_inclusive_exclusive);
spannablestring.setspan(sizespan02, 1, 2, spanned.span_inclusive_exclusive);
spannablestring.setspan(sizespan03, 2, 3, spanned.span_inclusive_exclusive);
spannablestring.setspan(sizespan04, 3, 4, spanned.span_inclusive_exclusive);
spannablestring.setspan(sizespan05, 4, 5, spanned.span_inclusive_exclusive);
spannablestring.setspan(sizespan06, 5, 6, spanned.span_inclusive_exclusive);
spannablestring.setspan(sizespan07, 6, 7, spanned.span_inclusive_exclusive);
textview.settext(spannablestring);

strikethroughspan

Android开发中SpannableString的富文本显示效果代码实现

strikethroughspan,为文本设置中划线,也就是常说的删除线,实现方法如下:

spannablestring spannablestring = new spannablestring("为文字设置删除线");
strikethroughspan strikethroughspan = new strikethroughspan();
spannablestring.setspan(strikethroughspan, 5, spannablestring.length(), spanned.span_inclusive_exclusive);
textview.settext(spannablestring);

看到这有没有小激动,分分钟实现天猫打折优惠效果,有木有?

underlinespan

Android开发中SpannableString的富文本显示效果代码实现

underlinespan,为文本设置下划线,具体实现方法如下:

spannablestring spannablestring = new spannablestring("为文字设置下划线");
underlinespan underlinespan = new underlinespan();
spannablestring.setspan(underlinespan, 5, spannablestring.length(), spanned.span_inclusive_exclusive);
textview.settext(spannablestring);

superscriptspan

Android开发中SpannableString的富文本显示效果代码实现

superscriptspan,设置上标,具体实现方法如下:

spannablestring spannablestring = new spannablestring("为文字设置上标");
superscriptspan superscriptspan = new superscriptspan();
spannablestring.setspan(superscriptspan, 5, spannablestring.length(), spanned.span_inclusive_exclusive);
textview.settext(spannablestring);

从效果图可以看出,被设置为上标的文字大小和下面的文本文字大小一样,只要我们稍加修饰,结合relativesizespan设置小字体文本作为上标,分分钟实现指数公式有木有,再也不用2^2+3^2=13这样缺乏审美的数学公式了,是不是超实用?

subscriptspan

Android开发中SpannableString的富文本显示效果代码实现

subscriptspan,设置下标,功能与设置上标类似,不做过多描述,具体实现方法如下:

spannablestring spannablestring = new spannablestring("为文字设置下标");
subscriptspan subscriptspan = new subscriptspan();
spannablestring.setspan(subscriptspan, 5, spannablestring.length(), spanned.span_inclusive_exclusive);
textview.settext(spannablestring);

stylespan

Android开发中SpannableString的富文本显示效果代码实现

stylespan,为文字设置风格(粗体、斜体),和textview属性textstyle类似,实现方法如下:

spannablestring spannablestring = new spannablestring("为文字设置粗体、斜体风格");
stylespan stylespan_b  = new stylespan(typeface.bold);
stylespan stylespan_i  = new stylespan(typeface.italic);
spannablestring.setspan(stylespan_b, 5, 7, spanned.span_inclusive_exclusive);
spannablestring.setspan(stylespan_i, 8, 10, spanned.span_inclusive_exclusive);
textview.sethighlightcolor(color.parsecolor("#36969696"));
textview.settext(spannablestring);

imagespan

Android开发中SpannableString的富文本显示效果代码实现

imagespan,设置文本图片,实现方法如下:

spannablestring spannablestring = new spannablestring("在文本中添加表情(表情)");
drawable drawable = getresources().getdrawable(r.mipmap.a9c);
drawable.setbounds(0, 0, 42, 42);
imagespan imagespan = new imagespan(drawable);
spannablestring.setspan(imagespan, 6, 8, spanned.span_inclusive_exclusive);
textview.settext(spannablestring);

这一个是不是很炫酷?再加一个解析算法,将文本中特定的文本转换成特定的表情图片,分分钟实现聊天表情显示效果有木有啊朋友们!

clickablespan

Android开发中SpannableString的富文本显示效果代码实现

clickablespan,设置可点击的文本,设置这个属性的文本可以相应用户点击事件,至于点击事件用户可以自定义,就像效果图显示一样,用户可以实现点击跳转页面的效果,具体实现方法如下:

spannablestring spannablestring = new spannablestring("为文字设置点击事件");
myclickablespan clickablespan = new myclickablespan("https://www.jianshu.com/users/dbae9ac95c78");
spannablestring.setspan(clickablespan, 5, spannablestring.length(), spanned.span_inclusive_exclusive);
textview.setmovementmethod(linkmovementmethod.getinstance());
textview.sethighlightcolor(color.parsecolor("#36969696")); 
textview.settext(spannablestring);

/***************************************************************/

class myclickablespan extends clickablespan {

    private string content;

    public myclickablespan(string content) {
        this.content = content;
    }

    @override
    public void updatedrawstate(textpaint ds) {
        ds.setunderlinetext(false);
    }

    @override
    public void onclick(view widget) {
        intent intent = new intent(mainactivity.this, otheractivity.class);
        bundle bundle = new bundle();
        bundle.putstring("content", content);
        intent.putextra("bundle", bundle);
        startactivity(intent);
    }
}

代码中我们自定义myclickablespan类,继承至clickablespan,并重写其中一些方法。ds.setunderlinetext()控制是否让可点击文本显示下划线,很明显,在上面代码中我选择了false,不显示下滑写。onclick点击事件的具体实现方法写在其中。如上代码,我们重写clickablespan的onclick方法实现activity的跳转效果,并传递跳转数据。

注意:使用clickablespan的文本如果想真正实现点击作用,必须为textview设置setmovementmethod方法,否则没有点击相应,至于sethighlightcolor方法则是控制点击是的背景色。

urlspan

Android开发中SpannableString的富文本显示效果代码实现

urlspan,设置超链接文本,其实聪明的小伙帮在讲到clickablespan的时候就能实现超链接文本的效果了,重写onclick点击事件就行,也确实看了urlspan的,urlspan就是继承自clickablespan,也和想象中一样,就是重写了父类的onclick事件,用自带打开链接,具体实现方法如下:

spannablestring spannablestring = new spannablestring("为文字设置超链接");
urlspan urlspan = new urlspan("https://www.jianshu.com/users/dbae9ac95c78");
spannablestring.setspan(urlspan, 5, spannablestring.length(), spanned.span_inclusive_exclusive);
textview.setmovementmethod(linkmovementmethod.getinstance());
textview.sethighlightcolor(color.parsecolor("#36969696"));
textview.settext(spannablestring);

urlspanonclick事件的源码如下:

@override
public void onclick(view widget) {
    uri uri = uri.parse(geturl());
    context context = widget.getcontext();
    intent intent = new intent(intent.action_view, uri);
    intent.putextra(browser.extra_application_id, context.getpackagename());
    try {
        context.startactivity(intent);
    } catch (activitynotfoundexception e) {
        log.w("urlspan", "actvity was not found for intent, " + intent.tostring());
    }
}

除此之外,还有maskfilterspan可以实现模糊和浮雕效果,rasterizerspan可以实现光栅效果,因为以上两个使用频率不高,而且效果也不是很明显,就不做详细说明,有兴趣的小伙伴不妨去试一试。

spannablestringbuilder

应该有不少开发的小伙伴知道stringbuilder,可以使用append()方法实现字符串拼接,非常方便。同样,spannablestring中也有spannablestringbuilder,顾名思义,就是实现对,spannablestring的一个拼接效果,同样是append()方法,可以实现各种风格效果的spannablestring拼接,非常实用。