当前位置: 移动技术网 > IT编程>移动开发>Android > Android RichText 让Textview轻松的支持富文本(图像ImageSpan、点击效果等等类似QQ微信聊天)

Android RichText 让Textview轻松的支持富文本(图像ImageSpan、点击效果等等类似QQ微信聊天)

2019年07月24日  | 移动技术网IT编程  | 我要评论

在职研究生心理学,汤姆克鲁斯 科学教,吉林四逃兵

androidrichtext帮助实现像qq,微信一样的,一个textview里既有文字又有表情又有图片的效果,采用插件化的框架,代码简单,可拓展性强。

基础框架包只有四个java文件,

richtextwrapper :textview的包裹类,实现支持富文本,通过new richtextwrapper(textview v)来构造。

rtmovementmethod: 继承自android原生的linkmovementmethod,重写ontouchevent方法,优化了clickspan(点击响应的文字区域)的点击响应。

 resolver:一个接口,我们需要实现一种支持富文本类型时就只需要写一个相应的resolver重写它的resolve方法,在resolve方法里实现所要实现的富文本样式。

richtexts:一些公用方法、类、接口的集合。接下来简单介绍一下如何使用这个框架:

//直接根据textview new一个richtextwrapper,之后所有的事情都可以用它完成;
richtextwrapper richtextwrapper = new richtextwrapper((textview) findviewbyid(r.id.tv_main));
//比如qq希望在textview里同时有表情和图片那么就可以相应的写两个resolver来实现分别的功能,直接在初始化时调用addresolver传入就可以。
richtextwrapper.addresolver(imageresolver.class,emotionresolver.class);
//同时,我们如果希望点击图片时有响应事件,可以使用setonrichtextlistener来处理,参数要传入对应的resolver,这里是imageresolver,如果我们需要自定义的xxresolver处理的富文本效果实现响应事件,那么久传入xxresolver.class;
richtextwrapper.setonrichtextlistener(imageresolver.class, new richtexts.richtextclicklistener() {
@override
public void onrichtextclick(textview v, string content) {
//在这里可以进行图片的点击事件处理
     //do something
}
});
//最后直接把文本set进去就可以
richtextwrapper.settext(content); 

addresolver可以传入任意个resolver,让textview支持我们需要的富文本类型,如果需要取消支持某种富文本类型,只需要不传入该resolver比如上文中如果只需要支持表情,那么 richtextwrapper.addresolver(emotionresolver.class);
不需要做太多代码改动,比较灵活。

那么此外,大家可以看出来另一个关键的地方就是resolver;resolver是如何实现呢?这边使用一个demo来简单示例:

public class imageresolver implements resolver {
public static final string img_match_regular = "\\[img](\\w+)\\[/img]";
public static pattern pattern = pattern.compile(img_match_regular);
//参数中的sp是该textview的content,extra是方便我们使用的一个附加的数据,默认是空的,我们如果希望从外面传入数据到这里面可以通过richtextwrapper.putextra()来实现
@override
public void resolve(final textview textview, final spannable sp, sparsearray<object> extra, final richtexts.richtextclicklistener listener) {
matcher matcher = pattern.matcher(sp);
final context context = textview.getcontext();
while(matcher.find()){
string content = matcher.group(1);
final richtexts.taggedinfo info = new richtexts.taggedinfo(matcher.start(),matcher.end(),content);
if(listener!=null) {
richtexts.richtextclickspan span = new richtexts.richtextclickspan(listener,info.content);
sp.setspan(span, info.start, info.end, spannable.span_exclusive_exclusive);
}
richtexts.stickerspan testspan = new richtexts.stickerspan(context, r.drawable.icon,100,100);
richtexts.setimagespan(sp, info, testspan);
textview.postinvalidate();
}
} 

上面的示例中,richtextclickspan是大家如果需要实现点击效果必须要用到的,而stickerspan则是实现图像效果,以上一个可点击的图像的resolver就实现了,当然上文中是随便传入一个icon,真实情况,大家需要自己根据内容以及所期待的效果自己再做些调整。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网