AndroidRichText 让Textview轻松的支持富文本(图像ImageSpan、点击效果等等类似QQ微信聊天)
2016-01-25 20:12
841 查看
代码地址:https://github.com/Luction/AndroidRichTextAndroidRichText帮助实现像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 = "\\"; 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,真实情况,大家需要自己根据内容以及所期待的效果自己再做些调整。。代码地址:AndroidRichText源码地址
相关文章推荐
- 微信抢红包软件说明
- 微信支付太坑了
- ios微信修改title
- APP创业者必知的H5、微信开发、APP优缺点分析
- 【箭扣观点】企业类微信,这次能“钉”上吗?
- 微信企业号红包提交签名错误解决
- 微信公众平台开发(PHP) 数据库操作
- 微信自定义分享JS-SDK制作
- 微信红包算法
- iOS-OC-仿微信摇一摇
- perl 实现微信登录 获取好友 群信息的简单实现
- 微信公众平台入门到精通四
- 微信模板信息发送给用户(JAVA)
- 微信公众平台开发调试方法
- 微信公众号与服务器对接验证
- 微信公众平台入门到精通三
- 微信公众平台从入门到精通二
- 微信公众平台入门到精通一
- "抢红包"大战,你准备好了吗?
- 微信公众平台消息体加解密实现