Android
これは、公式core-ktx
ライブラリの拡張クラスやメソッドなどを調べて、プロジェクト開発にどのような利便性をもたらすことができるかを調べるための一連の記事です。更新された記事のリストは次のとおりです。
公式のcore-ktxライブラリは、知っておく必要のある開発にどのような便利さをもたらすことができますか?
次に、この記事では、ライブラリがリッチテキストの開発にどのような便利さをもたらすかを見
Span
てcore-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つを構築する方法を参照してください
SpannableStringBuilder
:次のようなコードで使用できます。
private fun test4() { val build = buildSpannedString { //操作各种Span } }
buildSpannedString()
このメソッドの関数型はに属していることに注意してください。つまり、定義されたパブリックプロパティメソッド(拡張メソッドを含む)带接收者的函数类型
にアクセスできます。次に、ライブラリが提供する拡張メソッドSpannableStringBuilder
を見てみましょう。core-ktx
SpannableStringBuilder
-
SpannableStringBuilder.backgroundColor()
背景色を設定します。この拡張メソッドは
颜色值
背景色を渡す必要があります。これbackgroundColor()
により、オブジェクトを自動的に作成できます。また、メソッドを使用してレンダリングするテキストコンテンツを設定するなどForegroundColorSpan
の関数型を渡し、最後にメソッドを呼び出すこともできます。builderAction
append()
inSpan()
分かりますか、最終的にはこのメソッドで
xxxSpan
設定しSpannableStringBuilder
ます。最後に、次のように使用できます。val build = buildSpannedString { //操作各种Span backgroundColor(Color.RED) { append("开始了") } }
-
SpannableStringBuilder.bold()
太字に設定:このメソッドは、上記のようなオブジェクトの
bold()
作成に自動的に役立つことがわかります。StyleSpan
val build = buildSpannedString { bold { append("开始了") } }
-
その他の
SpannableStringBuilder.xxx()
リッチテキスト設定拡張機能:core-ktx
库提供了很多富文本设置的扩展方法,这里就只介绍上面的两个,其他的就不再这里介绍了,可以自行看下源码: -
一个非常非常简单的使用技巧
假设当前有一小段文本
遮天是一群人的完美,完美是一个人的遮天
,我想要对整段文本设置一个背景色,对一群人
这三个字设置一个粗体大小,利用上面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
扩展
SpannableStringBuilder
、SpannableString
等实现了Spannable
接口,所以Spannable
定义的扩展方法对常用的SpannableStringBuilder
、SpannableString
同样适用。
-
Spannable.clearSpans
清理所有标识(包括各种Span)使用时,直接对
Spannable
及其子类调用clearSpans()
即可。 -
Spannable.set(start: Int, end: Int, span: Any)
设置Span这个扩展方法就比较牛逼了,它是一个
运算符重载函数
且重载了[xxx]
运算符来设置Span的,我们看下使用:val stringBuilder = SpannableStringBuilder() //设置背景色 stringBuilder[0, 2] = BackgroundColorSpan(Color.RED)
有没有眼前一亮的感觉哈!!
-
Spannable.set(range: IntRange, span: Any)
设置Span这个方法和上一个方法很像,不过传入的设置Span标识范围的方式发生了改变,变成了一个
IntRange
类型,我们直接看下使用:val stringBuilder = SpannableStringBuilder() //设置背景色 stringBuilder[0..3] = BackgroundColorSpan(Color.RED)
-
CharSequence.toSpannable()
转换CharSequence
为SpannableString
这个很简单,就不再进行举例说明了。
core-ktx
库的Spanned
扩展
Spanned
的子接口包括我们上面刚讲到的Spannable
,所以它定义的扩展方法对于SpannableStringBuilder
、SpannableString
同样适用。
-
CharSequence.toSpanned()
转换CharSequence
为SpannedString
注意和
isSpannable()
转换的区别,一个能设置Span,一个不能设。 -
Spanned.getSpans()
获取指定类型的Span标识借助于Kotlin的泛型实化
reified
+inline
简化了传入具体Span类型的逻辑,我们看下使用:private fun test4(builder: SpannableStringBuilder) { val spans = builder.getSpans<BackgroundColorSpan>() }
获取类型为
BackgroudColorSpan
的所有Span对象,如果我们想要获取所有的Span对象,直接将传入的泛型类型改为Any
即可。 -
Spanned.toHtml()
将富文本转换成同等效果显示的html
代码也就是说如果你富文本中存在
ImageSpan
,转换成html
代码时,就会帮你在对应位置添加一个<img src="" />
的标签,我们简单看下其核心源码Html.withinParagraph()
中的片段:
富文本绘制复杂布局的两种技巧
-
ReplacementSpan
这个Span使用非常灵活,它提供了方法draw()
可自定义绘制你想要的布局效果; -
如果使用
ReplacementSpan
自定义绘制布局还是太过于复杂,可以考虑先使用原生组件在xml
中实现这个布局效果,然后将这个xml
通过Inflate
转换成View
,并将调用View
的onDraw()
方法,手动绘制到我们自定义Bitmap
中,经过这个流程,我们就将这个复杂的布局转换成了Bitmap
图像,然后使用ImageSpan
加载该Bitmap
,最终渲染到富文本中即可。请注意,请根据实际情况判断,是否需要先手动测量这个转换的
View
,然后再将其绘制到我们自定义的Bitmap
中,否则可能不生效。
总结
上記はcore-ktx
、リッチテキスト用にライブラリによって提供されるすべての拡張メソッドです。コアソースコードは、これらSpannableStringBuilder.kt
3つのファイルに含まれています。SpannableString.kt
SpannedString.kt
-
ナゲッツテクノロジーコミュニティのクリエイター署名プログラムの募集に参加しています。リンクをクリックして登録し、送信してください。