代码地址: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() {@Overridepublic 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()来实现
  @Overridepublic 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源码地址


转载于:https://www.cnblogs.com/luction/p/5158594.html

AndroidRichText 让Textview轻松的支持富文本(图像ImageSpan、点击效果等等类似QQ微信聊天)...相关推荐

  1. Winform Datagridview 单元格html格式化支持富文本

    Winform Datagridview 单元格html格式化支持富文本 示例: 源码:https://github.com/OceanAirdrop/DataGridViewHTMLCell 参考: ...

  2. Python-flask 使用Markdown和Flask-PageDown支持富文本文章

    Python-flask 使用Markdown和Flask-PageDown支持富文本文章 导入库 from flask_pagedown import PageDown from flask_pag ...

  3. xiuno开发文档_觅道文档开始支持富文本编辑器

    MrDoc(觅道文档)是州的先生基于 Python 后端编写的开源在线文档系统. 最初,觅道文档以 Markdown 书写为核心,集成了 EditorMD 和 Vditor 两大主流 Markdown ...

  4. 11.4 使用Flask-PageDown支持富文本文章

    我们编辑长文章的时候, 单一的文本格式便满足不了要求, 于是我们使用PageDown,PageDown的作用是使用javascript实现客户端markdown到html的程序转换. Flask-Pa ...

  5. html5qq邮箱代码,使用qq邮箱批量发送邮件 实例源码(支持富文本)

    资源下载此资源下载价格为3D币,请先登录 资源文件列表 MailSending/MailSending/App.config , 184 MailSending/MailSending/Form1.D ...

  6. 如何批量发送html邮件,使用qq邮箱批量发送邮件 实例源码(支持富文本)

    [实例简介] [实例截图] [核心代码] using System; using System.Collections.Generic; using System.ComponentModel; us ...

  7. echarts.js刻度标签实现富文本实现中文+图片的效果解决方法

    首先,原型大哥又给我添加难度了,查找echarts官网,找到类似于这样的例子: 该功能在这个基础上作出适当修改. ①通过后台获取到想要的数据类型: @RequestMapping("/get ...

  8. 如何扩展Android富文本之Html标签

    前言 大家都知道Android 富文本其实就是HTML标签那些东西,但Android本身对其支持有限,今天就说说如何对其进行扩展 富文本 在Android设置富文本一般如下 String txt = ...

  9. Android富文本开发,从0到1!

    点击上方 "程序员小乐"关注, 星标或置顶一起成长 后台回复"大礼包"有惊喜礼包! 每日英文 Each night I put my head to my pi ...

最新文章

  1. oracle的表几种连接比较,几种表连接方式的使用场景
  2. 爬虫时出现 IndexError: list index out of range 的原因
  3. win10巨帧数据包在哪里设置_Win10电脑总感觉网速慢,是什么原因
  4. Hadoop教程(二):安装
  5. 2021-07-03
  6. C++中auto的用法,说明的是变量的寿命
  7. Neutorn LBaaS 原理
  8. 看了些关于rem的知识点,在这做个自我总结归纳
  9. Java中哪些可以作为GC Roots
  10. CryptoKitties加密猫合约详解
  11. Android开发-Android项目结构
  12. 如何使用AxureShare创建团队文件
  13. 海贝思蓝牙接收器Linux,Hagibis海备思 蓝牙音频接收 耳机怎么样,评测
  14. 分布式机器学习联邦学习论文阅读笔记(持续更新)
  15. 通过修改环境变量修改当前进程使用的系统 Temp 文件夹的路径
  16. 坦克类游戏的制作之路
  17. ORBSLAM论文翻译
  18. 程序员写给老婆的代码
  19. 手把手教你拿到小世界里妹子的 QQ 号 !
  20. 提交SVN时出现目录obstructed的解决办法·

热门文章

  1. 零基础自学python看什么书-零基础Python入门看哪本书好?这里有答案
  2. python编程入门p-Python是什么?简单了解pythonp-入门
  3. 计算机考试函数应用题及答案,计算机等级考试题库,二级C++试题及答案
  4. usaco Arithmetic Progressions
  5. LeetCode Reconstruct Original Digits from English
  6. 第二周数据采样过程及结果
  7. 【AMAD】splinter -- 用于测试web app的python框架
  8. vue 数据绑定 绑定属性 循环渲染数据
  9. springboot_4 spring boot 使用servlet,filter,listener和interceptor
  10. 软件工程--团队作业4