语义

概览

本文档介绍了 Fuchsia 上无障碍功能的语义 API 和相关基础架构。这是无障碍功能管理器的一部分,用于从 Fuchsia 上的客户端视图中收集有关界面元素的信息,并将这些信息提供给屏幕阅读器等无障碍服务。

背景

  • Flutter 语义文档
  • Chromium AXNode 实现

  • 视图 - 与设备上屏幕特定区域对应的场景视图。它由界面框架绘制。

  • 界面框架 - 在本文档中,“界面框架”是指在 Fuchsia 上绘制用户可见视图的内容。通常是 Flutter 或 Chromium 视图。

设计

语义树

语义树是与界面元素对应的节点的无环图。总的来说,语义树代表了当前可用的整个界面。这是无障碍功能框架(例如 Chrome、Windows、iOS、Flutter 等)中广泛使用的概念。

在 Fuchsia 上,界面可能由多个景观视图组成,而无障碍功能框架会为屏幕上的每个视图跟踪单独的语义树。此图显示了一个包含多个语义树的示例界面。

此图仅从景观的角度展示了 Fuchsia 界面的层次结构。顶部是“Scene”文件夹的许多景观。每个视图都与一个用于显示某些界面的运行时相关联,包括 Flutter 运行时和 Chromium 运行时。每个 Flutter 和 Chromium 运行时均在自身内部维护了一个将提供给无障碍功能管理器的语义层次结构。

在内部,Flutter 和 Chromium 都能够为所渲染的界面生成语义树。Fuchsia 无障碍框架为运行时提供了一个 API,以便视图可以将其语义树公开给操作系统。

semantics API

可在 fuchsia.accessibility.semantics 中找到 semantics API。 借助此 API,界面框架可以向无障碍功能管理器注册以提供语义更新,然后调用 UpdateSemanticNodes、DeleteSemanticNodes 和 CommitUpdates 方法以发送有关其语义的信息。

语义树更新序列

由于语义树可能非常大(例如,在复杂的网站上),因此语义树的变化可能会由界面框架分解为多次调用。无障碍功能管理器会存储这些更新,直到界面框架调用“Commit”为止,然后更改其本地树并执行验证。这样,无障碍管理器就可以获得一致(但可能已过时)的可在本地访问的语义视图。

界面框架协定

在 Fuchsia 上启动视图的任何用户都应注册语义管理器协议,并提供 SemanticListener。通常,视图所有者使用 Flutter 或 chromium 等界面框架来创建视图。框架的 Fuchsia 集成负责实现特定于 Fuchsia 的详细信息。框架集成还会提供 ViewRef,后者是用于唯一标识视图的内核对象。

SemanticsManager 协议如下所示:

[Discoverable]
protocol SemanticsManager {
   RegisterViewForSemantics(fuchsia.ui.views.ViewRef view_ref,
                            SemanticListener listener,
                            request<SemanticTree> semantic_tree_request);
};

借助语义监听器,无障碍管理器可以启用或停用语义更新以及执行点击测试等操作。实际上,这由 Flutter 和 Chromium 界面框架集成(可实例化 Scenic 视图)处理。

界面框架实现应在视图的生命周期内保持此 FIDL 连接,即使语义被停用也是如此。

如果界面框架发出无效的更新,无障碍管理器将关闭该通道。如果提交更新不能生成格式正确的无环树,则此更新会被视为无效。例如,引用不存在的子节点或缺少根节点。

界面框架负责为该视图重新建立注册(如果错误可恢复)或崩溃/重启(如果不可恢复)。界面框架实现必须谨慎,避免重复尝试与无效的语义树连接。

点击测试

命中测试是将屏幕上的位置转换为特定语义节点的过程。为了在 Fuchsia 上进行点击测试,该框架必须解决两个问题

  • 查找与该营业地点对应的视图
  • 在视图内找到位于该位置的节点

无障碍功能管理器会从景观网站接收指针事件(如需了解详情,请参阅无障碍功能输入文档)。风景区使用与所属视图的 viewRef 相关联的 KOID(内核对象 ID)为每个指针事件添加注解。这样,屏幕阅读器就可以将触摸映射到特定的语义树,并将触摸路由到正确的 SemanticListener,以进行命中测试。点击测试操作如下所述。

语义监听器操作

界面框架提供的语义监听器允许无障碍功能框架在客户端视图中执行操作。这些内容可以为框架提供信息(例如,在使用命中测试来确定用户点按的节点时)或在客户端视图中进行更改(例如,使用默认操作点击按钮)。以下是支持的监听器操作(请参阅 API 中的“Action”枚举):

  • 命中测试 - 使用视图局部 (x,y) 坐标进行框架查询,而客户端视图返回该位置处的节点的 ID,以及(可选)从树的根到该节点的路径。
  • 默认操作 - 将节点 ID 作为输入。点按或点击按钮的逻辑等效项。
  • 在屏幕上显示 - 将节点 ID 作为输入。滚动界面以显示该节点。客户端视图负责确定如何做到这一点。
  • 增减 - 调整滑块的当前值。

树导航与排序

无障碍功能框架提供了一些基本实用程序,用于通过查找树中的下一个或上一个节点来浏览视图的语义树。这样即可通过界面进行线性导航。这种导航按深度优先的顺序进行。

调用方可能会为下一个/上一个函数提供过滤函数,以允许遍历特定类型的所有节点(例如标头、链接等)。这还可用于跳过根据给定指标无法“描述”的节点。