7月QCon广州站2022,关注Web 3.0、数据架构选型、数字化转型等热门话题,点击了解 了解详情
写点什么

Flow Model 的架构与设计

  • 2011 年 9 月 09 日
  • 本文字数:1418 字

    阅读完需:约 5 分钟

通过前面文章的介绍,相信大家对 TLF 的基本架构已经有所了解。本文将着重介绍 TLF 里的核心内容——Flow Model,包括 Flow Model 的组织结构和 TLF 的 Format。

要求

预备知识

熟悉 Flash Builder, Flex, 和 Actionscript 3.0。

需要的 Adobe 产品

内容预览

Flow Model 总览

Flow Model 包括 FlowElement 定义的对象以及 TextlayoutFormat 定义的格式。Flow Model 定义了数据结构来保存文本,它使用树形结构来存储文本和节点。其中 FlowElement 是整个 TLF 的核心,它是 Flow Model 中所有其它 Element 的基类。FlowElement 是有格式的,并提供设置格式的接口。

Flow Model 的组织结构

TLF 中的文本元素以树形结构存储,树中的元素表示文本内的逻辑分段。上图展示了 Flow Model 中各个类之间的继承关系,其中最重要的就是 FlowElement,FlowGroupElement 和 FlowLeafElement 这三个抽象基类,它们定义了这个树形结构。FlowElement 类是该树中所有元素对象的抽象基类,FlowGroupElement 类是所有容器元素对象的抽象基类,而 FlowLeafElement 类是所有叶子节点元素的抽象基类。

FlowElement 对象可以代表一篇文章,多篇文章或者一篇文章中的一段文字,并提供了一些文本元素的基本属性和方法。比如,使用 parent 属性访问父节点、textLength 属性获得文本长度以及 relativeParentStart 属性获得相对父节点的起始位置。

FlowGroupElement 类是所有的容器元素对象的基类,这些容器对象可以有一个或多个子节点,并提供 API 来操作和遍历这些子节点。容器类有 TextFlow,ParagraphElement,DivElement 和 LinkElement。其中,LinkElement 类代表一个超文本链接,与 XHTML 中的标签类似。链接中可以包含一个或多个 SpanElement,InlineGraphicElement 或者 TCYElement。TCYElement 代表竖排文本中的一小段横排文本,你可以在日文中使用 TCYElement 代表竖排文本中的一段横排文本。

FlowLeafElement 是树形结构中最底层元素对象的抽象基类,这些对象没有子节点。FlowLeafElement 可以添加文本,并且提供遍历和操作其它叶子节点的 API。叶子节点类有 InLineGraphic 和 SpanElement。其中,SpanElement 类代表具有共同格式的一段文字。InlineGraphicElement 类代表文本中的一个图形元素,在使用的时候被看作是一个字符。

TLF 的 Format

TLF 中有一个专门的类 TextLayoutFormat 负责 Flow Model 中元素的格式。TextLayoutFormat 支持一些预定义的格式名称与合法的赋值,FlowElement 类提供了设置格式的方法。

每一个格式属性在实现上其实是 TextLayoutFormat 类中一个属性类的静态实例,而属性类负责验证对应的格式的值是否合法。有一些格式属性非常复杂,可以接收数字,百分数甚至枚举类型。在实现上,属性类会持有一个数组来保存所有支持的类型。

上图展示了 TLF 的格式级联,如果子节点的格式没有定义,它会采用父节点设置的格式;如果子节点的格式定义与父节点不同,会覆盖父节点的格式。如上图,中间的 SpanElement 的字体定义为加粗,其父节点字体为正常,那么 SpanElement 中的文字将是粗体。此外,所有的格式都是无类型的,即类型为 *。

TextLayoutFormat 支持用户自定义的格式,可以是任意的键值对,但是不要和内置的格式冲突。

下一步要做的事情

本文讲述了 TLF 中 Flow Model 的架构与设计,想要了解更多有关 TLF 的知识,请参考 TLF 开发人员的系列教程。

TLF 概览

查看原文: Flow Model 的架构与设计

2011 年 9 月 09 日 00:00719

评论

发布
暂无评论
发现更多内容

程序员修炼的务实哲学

博文视点Broadview

程序员 软件 编程思维 工程师 编程之路

每个人都是领导者的工程团队

hongfei

工程能力 项目实践

你不知道的SSD那些事

焱融科技

分布式 存储 SSD nvme

Python 自动化办公之"你还在手动操作“文件”或“文件夹”吗?"

JackTian

Python 自动化

这是一个测试文档

Geek_073cad

MySQL的各种日志

超超不会飞

MySQL

ARTS 第二周打卡

陈文昕

互联网时代的界限管理

非著名程序员

程序员 职场 提升认知 界限管理

# LeetCode 215. Kth Largest Element in an Array

liu_liu

算法 LeetCode

Vue生态篇(二)

shirley

Vue

从 0 到 1 搭建技术中台之发布系统实践:集泳道、灰度、四端和多区域于一体的设计与权衡

伴鱼技术团队

架构 系统设计 系统架构 系统性思考 架构设计

我的 windows 利器

玄兴梦影

工具

架构学习历程

ARTS - Week Two

shepherd

js algorithm

patroni 通过服务启动报错

hobson

数据库 高可用 AntDB

匆忙的一周 ARTS第二周

困到清醒

从技术到管理,我在极客时间的成长历程

邓建春

一个人,沿着童年的路究竟可以走多远?

zhoo299

童年 NASA 航天

原创 | 使用JUnit、AssertJ和Mockito编写单元测试和实践TDD (十三)编写测试-生命周期方法

编程道与术

Java 编程 TDD 单元测试 JUnit

奈学:传授“带权重的负载均衡实现算法”独家设计思路

奈学教育

分布式

开源分布式文件系统大检阅

焱融科技

开源 sds 存储 焱融科技 文件存储

机器学习算法评估指标——2D目标检测

做技术BP的文案Gou

这些Java8官方挖的坑,你踩过几个?

牧码哥

Java 踩坑 加密 「Java 25周年」

我常用的浏览器插件

彭宏豪95

chrome 效率工具 浏览器 插件

# LeetCode 863. All Nodes Distance K in Binary Tree

liu_liu

算法 LeetCode

情绪的力量:如何使用情绪来达成目标

董一凡

情绪

杂谈-JSONP探索

卡尔

Java jsonp

Redis持久化了解一波!

不才陈某

redis 程序员 后端

知识也会生宝宝?

史方远

个人成长 随笔杂谈

Go语言分布式系统配置治理

田晓亮

微服务

【Java 25周年有奖征文获奖名单公布!!!】关于Java,你最想赞扬、吐槽、期待的变化是什么?

InfoQ写作社区官方

写作平台 Java25周年 热门活动

Flow Model 的架构与设计_语言 & 开发_田勇_InfoQ精选文章