公式のcore-ktxライブラリがリッチテキストSpan2の開発にどのような利便性をもたらすことができるか

Androidこれは、公式core-ktxライブラリの拡張クラスやメソッドなどを調べて、プロジェクト開発にどのような利便性をもたらすことができるかを調べるための一連の記事です。更新された記事のリストは次のとおりです。

公式のcore-ktxライブラリは、知っておく必要のある開発にどのような便利さをもたらすことができますか?

次に、この記事では、ライブラリがリッチテキストの開発にどのような便利さをもたらすかを見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
    )
}

上記のコードは3つの関数と設定文本大小、背景颜色及点击事件を実装していますが、非常に多くのコードを記述しているため、記述が非常に面倒です。

core-ktxライブラリSpannableStringBuilder拡張

  1. 1つを構築する方法を参照してくださいSpannableStringBuilder

    image.png

    次のようなコードで使用できます。

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

    buildSpannedString()このメソッドの関数型はに属していることに注意してください。つまり、定義されたパブリックプロパティメソッド(拡張メソッドを含む)带接收者的函数类型にアクセスできます。次に、ライブラリが提供する拡張メソッドSpannableStringBuilderを見てみましょう。core-ktxSpannableStringBuilder

  2. SpannableStringBuilder.backgroundColor()背景色を設定します。

    image.png

    この拡張メソッドは颜色值背景色を渡す必要があります。これbackgroundColor()により、オブジェクトを自動的に作成できます。また、メソッドを使用してレンダリングするテキストコンテンツを設定するなどForegroundColorSpanの関数型を渡し、最後にメソッドを呼び出すこともできます。builderActionappend()inSpan()

    image.png

    分かりますか、最終的にはこのメソッドでxxxSpan設定しSpannableStringBuilderます。最後に、次のように使用できます。

    val build = buildSpannedString {
        //操作各种Span
        backgroundColor(Color.RED) {
            append("开始了")
        }
    }
    
  3. SpannableStringBuilder.bold()太字に設定:

    image.png

    このメソッドは、上記のようなオブジェクトのbold()作成に自動的に役立つことがわかります。StyleSpan

    val build = buildSpannedString {
        bold {
            append("开始了")
        }
    }
    
  4. その他のSpannableStringBuilder.xxx()リッチテキスト設定拡張機能:

    core-ktx库提供了很多富文本设置的扩展方法,这里就只介绍上面的两个,其他的就不再这里介绍了,可以自行看下源码:

    image.png

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

    假设当前有一小段文本遮天是一群人的完美,完美是一个人的遮天,我想要对整段文本设置一个背景色,对一群人这三个字设置一个粗体大小,利用上面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)

    image.png

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

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

    image.png

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

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

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

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

    image.png

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

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

    image.png

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

core-ktx库的Spanned扩展

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

  1. CharSequence.toSpanned()转换CharSequenceSpannedString

    image.png

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

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

    image.png

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

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

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

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

    image.png

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

    image.png

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

  1. ReplacementSpan这个Span使用非常灵活,它提供了方法draw()可自定义绘制你想要的布局效果;

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

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

总结

上記はcore-ktx、リッチテキスト用にライブラリによって提供されるすべての拡張メソッドです。コアソースコードは、これらSpannableStringBuilder.kt3つのファイルに含まれています。SpannableString.ktSpannedString.kt

おすすめ

転載: juejin.im/post/7116920821150400519