Android最好的Spannable构建工具, 首个支持正则匹配/GIF动画/图文混排/自适应文字

·  阅读 2556

市面同类型框架只是使用链式编程简化了下方法调用且限制住了官方方法

但富文本基本上是占位符或者拼接字符串, 所以期望是能像字符串一样拼接Span和正则替换

这里就推荐Spannable的扩展库: spannable

特点

  • 低学习成本
  • 首个支持替换/正则/捕获组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
ColorSpan快速创建文字颜色
HighlightSpan创建字体颜色/字体样式/可点击效果
ClickableMovementMethod等效LinkMovementMethod, 但没有点击背景色

图文混排

为解决官方的ImageSpan的问题(比如无法垂直对齐/加载网络图片), 故编写两个新的Span

  1. 网络(Glide)/本地图片加载
  2. 图片宽高指定
  3. 固定图片缩放比例
  4. 垂直居中对齐方式
  5. 圆角/裁剪/模糊
  6. 占位图/错误图
  7. 图片左右间距
  8. GIF动画
  9. 支持Shape
  10. 支持.9图
分类:
Android
标签:
收藏成功!
已添加到「」, 点击更改