首页 > 其他分享 >官方core-ktx库能对富文本Span开发带来哪些便利?

官方core-ktx库能对富文本Span开发带来哪些便利?

时间:2023-06-19 12:07:52浏览次数:42  
标签:core SpannableStringBuilder 对富 ktx stringBuilder length Span


这是一个系列文章,专门研究Android官方提供的core-ktx库里面的扩展类、方法等等,看看能为项目开发带来哪些便利。 已更新的文章列表如下:

你需要了解的官方core-ktx库能对开发带来哪些便利1

官方core-ktx库能对SparseArray系列、Pair开发带来哪些便利?

接下来,本篇文章就带你看下富文本开发中使用到的Spancore-ktx库会为其带来怎样的使用便利。

当前SpannableStringBuilder的使用现状

private fun test() {
    val stringBuilder = SpannableStringBuilder()
    var length = stringBuilder.length
    stringBuilder.append("开始了")
    //设置文本大小
    stringBuilder.setSpan(
        RelativeSizeSpan(20f),
        length,
        stringBuilder.length,
        Spannable.SPAN_INCLUSIVE_EXCLUSIVE
    )
    length = stringBuilder.length
    stringBuilder.append("执行了")
    //设置背景颜色
    stringBuilder.setSpan(
        BackgroundColorSpan(Color.parseColor("#ffffff")),
        length,
        stringBuilder.length,
        Spannable.SPAN_INCLUSIVE_EXCLUSIVE
    )
    length = stringBuilder.length
    stringBuilder.append("结束了")
    //设置点击事件
    stringBuilder.setSpan(
        object : ClickableSpan() {
            override fun onClick(widget: View) {
            }
        },
        length,
        stringBuilder.length,
        Spannable.SPAN_INCLUSIVE_EXCLUSIVE
    )
}

以上代码就实现了三个功能,设置文本大小、背景颜色及点击事件,却写了这么一大坨代码,写起来好麻烦!!

core-ktx库的SpannableStringBuilder扩展

  1. 看下如何构造一个SpannableStringBuilder:

官方core-ktx库能对富文本Span开发带来哪些便利?_kotlin

我们就可以在代码中这样使用:

```
private fun test4() {
    val build = buildSpannedString { 
        //操作各种Span
    }
} 
```

请注意,这个`buildSpannedString()`方法的函数类型属于`带接收者的函数类型`,意为着我们可以访问`SpannableStringBuilder`定义的公共的属性方法(包括扩展方法),接下来我们就看下`core-ktx`库为`SpannableStringBuilder`提供了哪些扩展方法。
  1. SpannableStringBuilder.backgroundColor()设置背景色:

这个扩展方法需要传入一个颜色值充当背景色,backgroundColor()会自动帮助我们创建一个ForegroundColorSpan对象;还可以传入一个函数类型builderAction,比如用作使用append()方法设置要渲染的文本内容,最终会调用到inSpan()方法:

官方core-ktx库能对富文本Span开发带来哪些便利?_android_02

是不是明白了,最终我们是在这个方法中将xxxSpan设置给SpannableStringBuilder的。最终就可以这样使用了:

```
val build = buildSpannedString {
    //操作各种Span
    backgroundColor(Color.RED) {
        append("开始了")
    }
}
```
  1. SpannableStringBuilder.bold()设置粗体:

可以看到bold()方法中会自动帮助我们创建一个StyleSpan对象,使用起来和上面差不多:

val build = buildSpannedString {
    bold {
        append("开始了")
    }
}
  1. 其他SpannableStringBuilder.xxx()富文本设置扩展:
    core-ktx库提供了很多富文本设置的扩展方法,这里就只介绍上面的两个,其他的就不再这里介绍了,可以自行看下源码:

官方core-ktx库能对富文本Span开发带来哪些便利?_kotlin_03

  1. 一个非常非常简单的使用技巧

假设当前有一小段文本遮天是一群人的完美,完美是一个人的遮天,我想要对整段文本设置一个背景色,对一群人这三个字设置一个粗体大小,利用上面core-ktx库提供的扩展,我们可以这样实现:

private fun test4() {
    val build = buildSpannedString {
        backgroundColor(Color.RED) {
            append("遮天是")
            bold {
                append("一群人")
            }
            append("的完美,完美是一个人的遮天")
        }
    }
}

核心就是SpannableStringBuilder.xxx()系列的富文本扩展方法的第二个参数是一个接收者为SpannableStringBuilder的函数类型,所以backgroundColor()bold()strikeThrough()等等可以相互嵌套使用,从来更简单的实现一些富文本效果。

使用时请注意,buildSpannedString()这个方法创建的SpannableStringBuilder最终会包装成一个SpannedString不可变对象,请根据实际情况使用。

core-ktx库的Spannable扩展

SpannableStringBuilderSpannableString等实现了Spannable接口,所以Spannable定义的扩展方法对常用的SpannableStringBuilderSpannableString同样适用。

  1. Spannable.clearSpans清理所有标识(包括各种Span)
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2vUVMtmY-1668664724736)(https://upload-images.jianshu.io/upload_images/25149744-66b8f5e752794fb4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

使用时,直接对Spannable及其子类调用clearSpans()即可。

  1. Spannable.set(start: Int, end: Int, span: Any)设置Span

官方core-ktx库能对富文本Span开发带来哪些便利?_android_04

这个扩展方法就比较牛逼了,它是一个运算符重载函数且重载了[xxx]运算符来设置Span的,我们看下使用:

```
val stringBuilder = SpannableStringBuilder()
//设置背景色
stringBuilder[0, 2] = BackgroundColorSpan(Color.RED)
```

有没有眼前一亮的感觉哈!!

  1. Spannable.set(range: IntRange, span: Any)设置Span

官方core-ktx库能对富文本Span开发带来哪些便利?_富文本_05

这个方法和上一个方法很像,不过传入的设置Span标识范围的方式发生了改变,变成了一个IntRange类型,我们直接看下使用:

```
val stringBuilder = SpannableStringBuilder()
//设置背景色
stringBuilder[0..3] = BackgroundColorSpan(Color.RED)
```
  1. CharSequence.toSpannable()转换CharSequenceSpannableString

官方core-ktx库能对富文本Span开发带来哪些便利?_android studio_06

这个很简单,就不再进行举例说明了。

core-ktx库的Spanned扩展

Spanned的子接口包括我们上面刚讲到的Spannable,所以它定义的扩展方法对于SpannableStringBuilderSpannableString同样适用。

  1. CharSequence.toSpanned()转换CharSequenceSpannedString

官方core-ktx库能对富文本Span开发带来哪些便利?_富文本_07

注意和isSpannable()转换的区别,一个能设置Span,一个不能设。

  1. Spanned.getSpans()获取指定类型的Span标识

官方core-ktx库能对富文本Span开发带来哪些便利?_android studio_08

借助于Kotlin的泛型实化reified+inline简化了传入具体Span类型的逻辑,我们看下使用:

```
private fun test4(builder: SpannableStringBuilder) {
    val spans = builder.getSpans<BackgroundColorSpan>()
}
```

获取类型为BackgroudColorSpan的所有Span对象,如果我们想要获取所有的Span对象,直接将传入的泛型类型改为Any即可。

  1. Spanned.toHtml()将富文本转换成同等效果显示的html代码

官方core-ktx库能对富文本Span开发带来哪些便利?_android studio_09

也就是说如果你富文本中存在ImageSpan,转换成html代码时,就会帮你在对应位置添加一个<img src="" />的标签,我们简单看下其核心源码Html.withinParagraph()中的片段:

官方core-ktx库能对富文本Span开发带来哪些便利?_kotlin_10

富文本绘制复杂布局的两种技巧

  1. ReplacementSpan这个Span使用非常灵活,它提供了方法draw()可自定义绘制你想要的布局效果;
  2. 如果使用ReplacementSpan自定义绘制布局还是太过于复杂,可以考虑先使用原生组件在xml中实现这个布局效果,然后将这个xml通过Inflate转换成View,并将调用ViewonDraw()方法,手动绘制到我们自定义Bitmap中,经过这个流程,我们就将这个复杂的布局转换成了Bitmap图像,然后使用ImageSpan加载该Bitmap,最终渲染到富文本中即可。

请注意,请根据实际情况判断,是否需要先手动测量这个转换的View,然后再将其绘制到我们自定义的Bitmap中,否则可能不生效。

总结

以上就是core-ktx库针对于富文本提供的所有扩展方法,核心的源码就在SpannableStringBuilder.ktSpannableString.ktSpannedString.kt这三个文件中,大家有需要请自行查看。

作者:长安皈故里


标签:core,SpannableStringBuilder,对富,ktx,stringBuilder,length,Span
From: https://blog.51cto.com/u_16163442/6512286

相关文章

  • ASP.NET Core 6框架揭秘实例演示[39]:使用最简洁的代码实现登录、认证和注销
    认证是一个确定请求访问者真实身份的过程,与认证相关的还有其他两个基本操作——登录和注销。ASP.NETCore利用AuthenticationMiddleware中间件完成针对请求的认证,并提供了用于登录、注销以及“质询”的API,本篇文章利用它们使用最简单的代码实现这些功能。(本文提供的示例演示已经同......
  • .NET Core Web API 实现图形验证码
    https://blog.csdn.net/liwan09/article/details/126319320?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-1-126319320-blog-101289369.235%5Ev38%5Epc_relevant_sort_base2&depth_1-utm_......
  • 2023-06-18:给定一个长度为N的一维数组scores, 代表0~N-1号员工的初始得分, scores[i] =
    2023-06-18:给定一个长度为N的一维数组scores,代表0~N-1号员工的初始得分,scores[i]=a,表示i号员工一开始得分是a,给定一个长度为M的二维数组operations,operations[i]={a,b,c}。表示第i号操作为:如果a==1,表示将目前分数<b的所有员工,分数改成b,c这个值无用,如果a==2,表示将......
  • 第三十节:EFCore7.x版本新功能总结
    一.linq改进1.GroupBy(1).可以直接GroupBy进行toList()输出了. PS:从EFCore3.x--6.x不能直接groupby进行输出了。(2).这种类型的GroupBy不会直接转换为SQL,因此EFCore对返回的结果进行分组。但是,这不会导致从服务器传输任何其他数据。toList()才会查询。(3).案......
  • 关于ManyCore的一些讨论
    T-MCer说:BadNews:虽然我们认为采用nccNUMA来解决cachecoherence的问题,但目前还很难找到有相关研究认为未来的multicore应该取消cachecoherence的限制,doyouhaveanyinfo.?Ray说:我昨天看Tilera(100core)的产品说明,他们也保证cache一致性:Tilera'sDDC™(DynamicDistrib......
  • coredb 使用pg all-in-one 解决方案
    coredb认为可以使用pg干任何事情,自己基于rust开发了不少pg的扩展,当然也包含了不少社区现有的扩展同时coredb还开发了一个pg扩展仓库(实际上以前社区也有一个)说明目前coredb还在开发中,核心技术栈基于了rust,一些理念还是值得学习参考的参考资料https://docs.coredb.io/https://......
  • Corel PaintShop下载-Corel PaintShop(相片管理) 软件大全
    CorelPaintShopPro是一套经济实惠的相片编辑与图形设计软体,不受订阅限。利用专业的影像编辑工具提升相片效果,或使用全新的色盘、笔刷、渐层、花纹及材质创作效果独特的设计。我们简化了使用者介面以提升浏览速度,并针对您最常使用的工具进行改良,更提供了全新工作区以符合您的专业......
  • ASP.NET Core MVC 从入门到精通之Identity入门
    随着技术的发展,ASP.NETCoreMVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NETCoreMVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生,或其他想从事ASP.NETCoreMVC系统开发的人员。经过前几篇文章的讲解,初步了解ASP.NETCore......
  • .Net Core医学检验LIS系统源码
    .NetCoreLIS系统源码,在第三方快检实验室、二级医院检验科应用5年以上,系统运行稳定、功能齐全,界面布局合理、操作简便。系统采用B/S架构SaaS模式,可扩展性强。LIS系统为实验室服务对象提供检验申请、采集标本、结果查询等功能;为实验室工作人员的核收标本、分送标本、传送资料、分析......
  • .net core 中使用Redis,及Redis问题
    1.安装Microsoft.Extensions.Caching.StackExchangeRedis包2.//分布式缓存  在startup的ConfigureServices中注入redis                               services.AddStackExchangeRedisCache(options=> ......