Android Span 架构介绍

前言

Android Span架构具备强大的能力,是像Drawable那样强大的。一个应用中文本是非常重要的组成部分,基本上无处不在,掌握Span架构能让应用中文本表现的更灵活更丰富,更富表现力。

框架

主要层级
  • CharacterStyle 影响字符级别的文本格式
  • UpdateAppearance 影响字符级别的文本外观
  • UpdateLayout 影响字符级别的文本测量大小
  • ParagraphStyle 影响段落级别的文本格式
FontMetrics
FontMetrics1.png
FontMetrics2.png
类图
  • CharacterStyle UpdateAppearance UpdateLayout

    Span.png

  • ParagraphStyle

    ParagraphStyle.png

工作原理

当调用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)——话题、@好友、表情解析工具类

参考

Android中的SpannableString,Spans以及TextView绘制原理

推荐阅读更多精彩内容

  •  前几天在微博上看到一个人评论Android Span机制相当强大,有必要细心研究一下,于是就google了一下,...
    程序员历小冰阅读 2,660评论 4 55
  • 探索 Android 中的 Span 在 Android 中,使用 Span 定义文本的样式. 通过 Span 改...
    TonnyL阅读 3,609评论 2 10
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 121,269评论 16 134
  • 概述 Android 自定义View过程中,绘制文字主要有如下手段: 通过Canvas的drawText的相关Ap...
    三十二蝉阅读 1,760评论 0 4
  • 还记得上大学时一次母亲节和妈妈的生日是一天,我就想送她一束康乃馨,因为妈妈是个喜欢浪漫的人,那时候鲜花只有在结婚时...
    狗尾巴草颂歌谣阅读 125评论 0 0