比较难理解的是SpanedString,查看其api,可以看到其只能通过SpannableString来创建,复制其Span属性来使用,这是我的理解不知道对不对,有了解的可以指导下。SpanedString使用场景也比较少吧,一直没用过。
对于SpannableString和SpannableStringBuilder,多个 span 可以被组合且同时附加到同一段文本上。如下面的红色和粗体叠加:
Android framework在android.text.style包提供了20+的Span样式,通过2个维度可以对Span进行分类:
-
基于Span是否改变text的外形还是改变text的尺寸或布局
-
基于Span的作用范围是字符级别还是或段落级别
Span的实现原理是,Android framework定义了几个接口和抽象类,这些接口和抽象类有允许Span访问TextPaint或Canvas对象的方法,它们会在测量和渲染时被检查,达到改变文本样式的效果。
影响text外观的Span
这些Span可以影响text外观:文本或背景颜色、下划线、删除线等等,如下UML类图所示,类名所见即所得。
这些Span会触发文本重新绘制,而不会触发重新布局。这些 span 实现了 UpdateAppearance 且继承自 CharacterStyle。CharacterStyle的子类通过提供更新 TextPaint 的访问方法,定义了怎样绘制文本。