市面同类型框架只是使用链式编程简化了下方法调用
但富文本基本上是占位符或者拼接字符串, 所以期望是能像字符串一样拼接Span和正则替换
这里就推荐Spannable的扩展库: spannable
本工具真正实现让Spannable和String一样易用, 快速实现常见的图文列表/图文混排/表情包需求/文字换行,
- 全网首个支持正则替换的Spannable框架, 学习成本完全等于字符串
- 完美实现图文混排的Span工具, 支持Shape/点九图/GIF/网络图片
- 其数据和视图的方便解耦, 更易于实现MVVM架构
特点
- 低学习成本
- 首个支持替换/正则/捕获组Span的库
- 全部使用CharSequence接口, 使用起来和字符串没有区别
- 没有自定义控件/没有多余函数
- 快速实现图文混排/富文本/自定义表情包
- 输入框富文本/表情包
- 可监听剪贴板粘贴/手动输入文本渲染
预览

使用
为了通用性函数全部使用的CharSequence接口, 使用起来和字符串没有区别
可以设置/插入/添加来构建Span
// 通过拼接方式展示价格
tv5.text = "¥".setSpan(ColorSpan("#ed6a2c"))
.addSpan("39.9", arrayOf(ColorSpan("#ed6a2c"), AbsoluteSizeSpan(18, true)))
.addSpan(" 1000+ 人付款")
.addSpan("image", CenterImageSpan(this, R.drawable.ic_touch).setDrawableSize(20, dp = true))
可以像string一样使用文字替换/正则匹配创建样式
tv.movementMethod = ClickableMovementMethod.getInstance()
tv.text = "隐私权政策 | 许可 | 品牌指南".replaceSpan("隐私权政策") {
URLSpan("https://github.com/") // 仅替换效果
}
tv.text = "隐私权政策 | 许可 | 品牌指南".replaceSpan("隐私权政策") {
listOf(URLSpan("https://github.com/"), ColorSpan("#ed6a2c")) // 替换多个效果
}
tv.text = "隐私权政策 | 许可 | 品牌指南".replaceSpan("隐私权政策") {
SpannableString("友情链接").setSpan(URLSpan("https://github.com/")) // 替换文字以及Span效果
}
// 还可以使用正则替换
tv2.text = "我们可以艾特用户@用户昵称 或者创建#热门标签"
.replaceSpan("@[^@]+?(?=\\s|\$)".toRegex()) { matchResult ->
HighlightSpan("#ed6a2c") {
Toast.makeText(this@MainActivity, "点击用户 ${matchResult.value}", Toast.LENGTH_SHORT).show()
}
}
// 通过丰富的正则/匹配功能你可以快速渲染占位符富文本
tv2.text = "当前货币单位为{{美元}}".replaceSpan("{{美元}}"){
CenterImageSpan(context, R.drawable.ic_dollar) // 将占位图替换成图片
}
由于所有函数返回值和接受者都是CharSequence你甚至可以封装到一个函数中复用一组Span规则, 比如实现直播间消息/评论内容/简单的富文本输入框
函数
使用的函数一定要非常简单
| 函数 | 介绍 |
|---|---|
| setSpan | 设置Span |
| addSpan | 添加/插入Span或字符串 |
| replaceSpan | 替换/正则替换Span或字符串 |
| replaceSpanFirst/replaceSpanLast | 替换/正则替换第一个/最后一个匹配项的Span或字符串 |
市面上大多是使用链式编程拼接Span我觉得扩展性极差而且为了节省几个单词就造一堆函数增加学习成本 如果你喜欢DSL或者链式编程可以使用其他作者的分叉版本:SpannableX
并包含一些常用的Span效果实现, 欢迎贡献自己的
| Span | 描述 |
|---|---|
| CenterImageSpan | 垂直对齐方式/图片宽高/固定图片比例/显示文字/自适应文字宽高/Shape/.9图 |
| GlideImageSpan | 网络图片/GIF动画/垂直对齐方式/图片宽高/固定图片比例/显示文字/自适应文字宽高, Require Glide |
| MarginSpan | 文字间距 |
| ColorSpan | 快速创建文字颜色 |
| HighlightSpan | 创建字体颜色/字体样式/可点击效果 |
| ClickableMovementMethod | 等效LinkMovementMethod, 但没有点击背景色 |
图文混排
为解决官方的ImageSpan的问题(比如无法垂直对齐/加载网络图片), 故编写两个新的Span
- 网络(Glide)/本地图片加载
- 图片宽高指定
- 固定图片缩放比例
- 垂直居中对齐方式
- 圆角/裁剪/模糊
- 占位图/错误图
- 图片左右间距
- GIF动画
- 支持Shape
- 支持.9图
| 项目 | 描述 |
|---|---|
| Net | 🍉 Android 最强大的创新式协程并发网络请求 |
| BRV | 🌽 Android 最强大的RecyclerView库, 比BRVAH更优雅和强大 |
| soft-input-event | Android软键盘遮挡/平滑动画最佳解决方案 |
| spannable | Android最好的Spannable构建工具, 首个支持正则匹配/GIF动画/图文混排 |
| Interval | Android计时器工具, 倒计时/正计时/开始/暂停/继续/结束/取消 |
| Serialize | 应用数据存储的神器, 比SQLite/SP更方便, 可创建自动本地读写/应用销毁恢复的字段, |
| StateLayout | 一行代码构建整个应用的缺省页 |
| StatusBar | 🍥 Android 一行代码配置透明状态栏 |
| Channel | 优雅的事件消息框架 🍯 LiveData / Coroutine / 生命周期 特性 EventBus |
| Tooltip | Toast(吐司)BubbleDialog(菊花加载框) |
| debugKit | 开发调试悬浮窗口工具 |
| LogCat | 日志输出工具 |
| Engine | 支持快速开发的基础库 |