前言
Android Span架构具备强大的能力,是像Drawable那样强大的。一个应用中文本是非常重要的组成部分,基本上无处不在,掌握Span架构能让应用中文本表现的更灵活更丰富,更富表现力。
框架
主要层级
-
CharacterStyle
影响字符级别的文本格式 -
UpdateAppearance
影响字符级别的文本外观 -
UpdateLayout
影响字符级别的文本测量大小 -
ParagraphStyle
影响段落级别的文本格式
FontMetrics
类图
-
CharacterStyle
UpdateAppearance
UpdateLayout
-
ParagraphStyle
工作原理
当调用TextView.setText(...)
,内部会适用Layout
管理文本测量计算和渲染,它有三个子类:
-
BoringLayout
负责显示单行文本,提供有isBoring()
用于判断是否单行文本 -
DynamicLayout
负责渲染Spannable
,内部会设置SpanWatcher
侦听Span
的变化,当产生变化时,会调用reflow
,重新进行布局 -
StaticLayout
单行文本,且非Spannable
的时候,不会监听span
变化,效率较DynamicLayout
高.里面处理了换行.
Layout.draw()
会负责文本的绘制,其中drawBackground
会递归LineBackgroundSpan
并调用lineBackgroundSpan.drawBackground
来进行背景的绘制.drawText
则会首先通过TextLine.obtain()
生成TextLine
,如果是文本,则调用canvas.drawText
绘制,如果包含了Spannble,emoji
,则交给TextLine
绘制.TextLine#draw()
会调用drawRun
,进而调用handleRun()
进行文本的渲染.TextLayoutCache
为了提高效率,在4.0之后加入.- 如果想要提升
TextView
的渲染效率,可以使用StaticLayout
.
使用
关于各种span的使用可以参考这里
Span样式示例代码
Spans,一个强大的概念,
Android Span 架构介绍,
实现类似新浪微博帖子显示(2)——话题、@好友、表情解析工具类