概览
本文档介绍了 Cloud Storage 的语义 API 和 在 Fuchsia 上实现了无障碍功能。这是无障碍管理器的一部分 从 Fuchsia 上的客户端视图中收集有关界面元素的信息,并使其 屏幕阅读器等无障碍服务提供的信息。
背景
链接
- Flutter 语义文档
视图 - 与视图的特定区域相对应的景观视图 屏幕上。这由界面框架绘制。
界面框架 - 在本文档中,“界面框架”指代有点什么 用于在 Fuchsia 上绘制用户可见视图。通常是 Flutter 或 Chromium 视图。
设计
语义树
语义树是与界面元素对应的节点的无环图。在 语义树表示当前可用的 界面。这是无障碍框架中广泛使用的概念,例如 Chrome、Windows、iOS、Flutter 等
在 Fuchsia 上,用户界面可能由多个风景视图和 无障碍功能框架会跟踪每个页面上每个视图的 屏幕。下图显示了一个包含多个语义树的示例界面。
在内部,Flutter 和 Chromium 都能够生成语义树 所呈现的界面Fuchsia 无障碍设施 框架为运行时提供 API 可以将其语义树公开给操作系统。
语义 API
语义 API 可在 fuchsia.accessibility.semantics 中找到。 此 API 允许界面框架向无障碍管理器注册, 提供语义更新,然后调用 UpdateSemanticNodes, DeleteSemanticNodes 和 CommitUpdates 方法,用于发送 语义信息。
语义树更新序列
由于语义树可能非常大(例如,在复杂的网站上), 语义树的更改可能会被界面划分为多次调用 框架。无障碍功能管理器会存储这些更新,直到界面框架 调用“Commit”然后更改其本地树并执行验证。这个 可让无障碍管理器获得一致的 日期视图)查看可在本地访问的语义。
界面框架协定
在 Fuchsia 上启动视图的任何人都需要向 SemanticsManager 协议并提供 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 界面框架集成处理,这些集成 美景。
界面框架实现应保持此 FIDL 连接 视图的生命周期。
如果界面框架发出的更新无效,无障碍功能管理器将 关闭频道。如果提交更新,则更新会被视为无效 才能生成结构良好的无环树。部分示例包括 或缺少根节点。
界面框架负责为其重新建立注册 视图(如果错误可恢复)或崩溃/重启(如果不可恢复)。护理 必须用在界面框架实现中,以避免重复尝试 与无效的语义树连接起来。
点击测试
点击测试是将屏幕上的位置转换为特定 语义节点。为了在 Fuchsia 上顺利进行测试,框架必须解决两个 题目
- 查找与相应营业地点对应的视图
- 在视图内的该位置找到节点
无障碍管理器从景观网站接收指针事件(有关详情,请参阅 无障碍功能输入文档)。Anthos 会为每个指针添加注解 事件,其中包含与 KOID(内核对象 ID)相关联的 viewRef 容器视图这样,屏幕阅读器就可以将触摸操作映射到 并将触摸路由到正确的 SemanticListener 点击测试匹配测试操作如下所述。
语义监听器操作
界面框架提供的语义监听器允许 框架在客户端视图中执行操作。这些方法可以 框架和框架的信息(例如,使用点击测试来确定 或在客户端视图中执行更改(针对 (使用默认操作点击按钮)。以下是 支持的监听器操作(请参阅“操作” enum):
- 点击测试 - 使用视图局部 (x,y) 坐标和 同时返回位于该位置的节点的 ID, (可选)从树的根目录到该节点的路径。
- 默认操作 - 将节点 ID 作为输入。点按逻辑等效于 也可以点击某个按钮
- 在屏幕上显示 - 将节点 ID 作为输入。滚动界面以显示 进入视图。客户视图负责确定 执行此操作。
- 增加/减少 - 调整滑块的当前值。
树导航和订购
无障碍功能框架提供了基本实用程序,用于在视图的 来提取语义树。这使得 支持线性导航。这种导航操作发生在 深度优先顺序。
调用方可以为下一个/上一个函数提供一个过滤器函数, 循环访问特定类型的所有节点(例如标头、链接、 等)。此属性还可用于跳过无法描述的节点根据 指定指标