AndroidRichText 让Textview轻松的支持富文本(图像ImageSpan、点击效果等等类似QQ微信聊天)
代码地址:https://github.com/Luction/AndroidRichText
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();
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,,);
RichTexts.setImageSpan(sp, info, testSpan);
textView.postInvalidate();
}
}
上面的示例中,RichTextClickSpan是大家如果需要实现点击效果必须要用到的,而StickerSpan则是实现图像效果,以上一个可点击的图像的Resolver就实现了,当然上文中是随便传入一个icon,真实情况,大家需要自己根据内容以及所期待的效果自己再做些调整。。
代码地址:AndroidRichText源码地址
AndroidRichText 让Textview轻松的支持富文本(图像ImageSpan、点击效果等等类似QQ微信聊天)的更多相关文章
- Winform Datagridview 单元格html格式化支持富文本
Winform Datagridview 单元格html格式化支持富文本 示例: 源码:https://github.com/OceanAirdrop/DataGridViewHTMLCell 参考: ...
- 富文本 文字图片点击,(TextView)
textview上的富文本支持 文字,图片的点击事件 - (void)protocolIsSelect:(BOOL)select { NSMutableAttributedString *attrib ...
- wxParse解析富文本内容使点击图片可以选中并实现放大缩小
wxParse解析富文本内容不多说,之前写过步骤介绍,主要是在使用过程中发现解析的富文本内容里有图片时有的可以点击放大缩小,有的点击却报错,找不到imgUrls. 经过排查发现:循环解析的富文本内容正 ...
- 使用KindEditor富文本编辑器,点击批量上传按钮没有选择图片按钮
问题:批量上传没有选择图片按钮
- iOS swift 富文本显示 富文本在iOS中使用场景和解决方案
项目中很多地方都会用到富文本的内容:比如一般的商品详情,视频详情,资讯详情等,运营人员通过后台的富文本编辑器编辑的内容,前端拿到的就是一段富文本的字符串,这富文本大多都是图片和文字的组合.我们今天介绍 ...
- 富文本 SpannableString Span
经典使用场景 SpannableStringBuilder needStartSSB = new SpannableStringBuilder("需要"); SpannableSt ...
- H5页面设计器,仿有赞商城页面在线设计器,比富文本框更友好的内容编辑器
基本上每个web应用,都会牵扯到内容编辑,尤其是移动的web应用,微信开发之类的.页面内容自定义是最常用的功能了,之前大部分解决方案都是采用富文本框编辑器kindeditor,ueditor,cked ...
- 微信小程序/支付宝小程序 WxParse解析富文本(html)代码
小程序本身并不太支持html代码,比如html的img.span.p这个时候改这么办呢?需要用到一个小插件WxParse来实现. 小程序高级交流群:336925436 微信小程序支持富文本编辑器代码 ...
- 用POP动画编写带富文本的自定义动画效果
用POP动画编写带富文本的自定义动画效果 [源码] https://github.com/YouXianMing/UI-Component-Collection [效果] [特点] * 支持富文本 * ...
随机推荐
- 使用CSS画一个三角形
<div style="width:0px;height:0px;border-width:40px;border-style:solid;border-color:transpare ...
- 谈网页游戏外挂之用python模拟游戏(热血三国2)登陆
看web看多了,想写写页游的外挂,其实原理是一样的,就是端口不一样协议字段你不知道,而这也提高了点技术门槛,看我们来一点一点突破这些门槛,这次我们来用python发包模拟flash的客户端登陆. 以热 ...
- DC-EPC小结
今晚上修完了最后2个学时的EPC(课程主页),这意味着本学期的DC和共20个学时的EPC到此结束,这有可能是我人生中最后一次上英语课. Tom是我DC课的老师,EPC起于Tom和Micheal的Deb ...
- Jboss wildfly add JDBC driver
Jboss wildfly 添加 JDBC driver 我这里使用的是 wildfly-8.0.0.Final 第一步: 首先在modules里面添加mysql的驱动包 例如:modules\sy ...
- cocos2dx中的菜单项CCMenuItem及其五个子类的使用
/*CCMenuItem是一个虚基类,因此必须实现它的五个子类之一,再把子类对象赋给父类指针,相当于多态*/ CCMenuItem *fontItem = CCMenuItemFont::create ...
- Liferay SDK 6.2与7.0中build.[$username].properties 文件的配置
这篇文章是针对刚开始开发Liferay的新手写的,希望能够帮到刚入门的开发者减少一些配置上的麻烦. 前提: 1. 下载了Liferay IDE(Liferay的官方开发工具) 2.下载了Liferay ...
- 学习Linux第一天
1.简介: 记住这个名字:Linus Torvals 系统组成:Linux内核,Shell, 文件系统,实时程序 Tips:在系统启动过程中,使用Alt+F2组合键,可以查看Ubuntu启动的详细过程 ...
- 2005: [Noi2010]能量采集 - BZOJ
Description 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量后,栋栋再使用一个能量汇集机器把这些植物采集到的能量汇集到一起. 栋栋的植物种得 ...
- IntelliJ IDEA 调试小记
一.IntelliJ IDEA 调试没有F6 Eclipse调试有F6,意为下一步,递增F8.可IntelliJ IDEA 调试没有这个. 二.图解 Step Over (F8): 下一步 (相当于E ...
- 增强学习(Reinforcement Learning and Control)
增强学习(Reinforcement Learning and Control) [pdf版本]增强学习.pdf 在之前的讨论中,我们总是给定一个样本x,然后给或者不给label y.之后对样本进行 ...