Android 富文本知识点记录
本文主要讲解 Android 系统富文本相关的知识点。
其他相关文章: TextView 显示富文本&部分点击生效
在 Android 系统中,想要实现富文本效果,主要通过两种方式:Span 和 Html Text。而 Html Text 底层仍然使用的 Sapn。所以我们掌握 Sapn 的使用即可。
更改文本的大小
我们可以使用 AbsoluteSizeSpan 更改部分文本的尺寸。AbsoluteSizeSpan 需要两个入参:尺寸以及是否使用 dip 值。当使用 dip 时,传入的尺寸就是 dp(比如 5 dp),否则就是 px 值。比如emoji 表情的尺寸可以使用以下代码设置为 11dp:emojiStr.setSpan(AbsoluteSizeSpan(11, true), startPos, emoji.length, SpannableStringBuilder.SPAN_EXCLUSIVE_EXCLUSIVE)
。
点击事件的问题
富文本 span 在最后时,不点击 span,也会触发 span 的点击事件。原因暂未查,源码可以看 MovementMethod 和 SpannableStringInternal.getSpans 相关的代码。
文本尺寸和位置调整
要调整 Emoji 尺寸和纵向偏移,我们可以自定义 span,其继承自 AbsoluteSizeSpan。通过调整 baselineShift,可以实现文本的纵向偏移,baselineShift 大于 0 表示向底部偏移,baselineShift 小于 0 表示向顶部偏移。代码如下:
class AbsoluteSizeMarginSpan(size: Int, useDp: Boolean, val bottomMargin: Int) : AbsoluteSizeSpan(size, useDp) {
override fun updateDrawState(ds: TextPaint) {
super.updateDrawState(ds)
// baselineShift 为文本纵向偏移,大于 0 向底部偏移,小于 0 向顶部偏移
ds.baselineShift = -bottomMargin
}
override fun updateMeasureState(ds: TextPaint) {
super.updateMeasureState(ds)
// baselineShift 为文本纵向偏移,大于 0 向底部偏移,小于 0 向顶部偏移
ds.baselineShift = -bottomMargin
}
}