語義

總覽

本文件說明語意 API 和相關基礎架構,以在 Fuchsia 上提供無障礙功能。這是無障礙管理員的一部分,該管理員會從 Fuchsia 的用戶端檢視畫面收集 UI 元素相關資訊,並向螢幕閱讀器等無障礙服務 (例如螢幕閱讀器) 提供該資訊。

背景

設計

語意樹

語意樹狀結構是對應 UI 元素的節點非循環圖。綜上所述,語意樹狀結構代表目前可用的完整 UI。這個概念在 Chrome、Windows、iOS、Flutter 等無障礙架構中廣泛使用。

在 Fuchsia 中,UI 可能由多個 View 檢視畫面組成,無障礙架構會針對畫面上的每個檢視畫面追蹤個別的語意樹狀結構。這圖顯示包含多個語意樹狀結構的 UI 範例。

這張圖僅從風景角度顯示 Fuchsia UI 的階層。畫面頂部的檢視畫面會管理許多檢視畫面。每個檢視畫面都會連結至顯示部分 UI 的執行階段,包括 Flutter 和 Chromium 執行階段。每個 Flutter 和 Chromium 執行階段都會保留在語意階層中,以便提供給無障礙管理工具。

Flutter 和 Chromium 內部能夠為轉譯的 UI 產生語意樹狀結構。Fuchsia 無障礙架構為執行階段提供 API,以便檢視畫面向 OS 公開語意樹狀結構。

語意 API

語意 API 可在 fuchsia.accessibility.semantics 中。這個 API 可讓 UI 架構向 Accessibility Manager 註冊,提供語意更新,然後呼叫 UpdateSemanticNodes、DeleteSemanticNodes 和 CommitUpdates 方法來傳送語意相關資訊。

語意樹狀結構更新順序

由於語意樹狀圖可能相當龐大 (例如在複雜的網站上),因此語意樹狀結構中的變更可能會依 UI 架構拆分為多項呼叫。無障礙功能管理工具會儲存這些更新內容,直到 UI 架構呼叫「Commit」,然後變更本機樹狀結構並執行驗證。如此一來,無障礙管理員就能以一致的方式 (即使可能過時) 檢視可在本機存取的語意。

UI 架構合約

在 Fuchsia 上啟動檢視畫面的任何使用者都應使用 SemanticsManager 通訊協定註冊,並提供 SemanticListener。一般來說,檢視畫面擁有者會使用 flutter 或 chromium 等 UI 架構建立檢視畫面。該架構的 Fuchsia 整合負責實作 Fuchsia 特定的詳細資料,架構整合也提供 ViewRef,這是專門用來識別檢視區塊的核心物件。

SemanticsManager 通訊協定顯示如下:

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

語意事件監聽器可讓無障礙管理員啟用或停用語意更新,並執行命中測試等動作。實際執行時,系統會透過 Flutter 和 Chromium UI 架構整合,將場景檢視畫面例項化。

即使停用語意,UI 架構仍應在檢視畫面的生命週期內維持這個 FIDL 連線。

如果 UI 架構發出無效更新,無障礙管理員會關閉管道。如果提交更新不會產生格式正確的循環樹狀結構,系統會將更新視為無效。包括參照不存在的子項節點或缺少根節點等。

UI 架構負責重新建立該檢視畫面的註冊 (如果錯誤可復原) 或當機/重新啟動 (如果無法復原)。請務必謹慎實作 UI 架構,以免重複嘗試連結無效的語意樹狀結構。

點擊測試

命中測試是將畫面上的位置轉譯成特定語意節點的程序。為了在 Fuchsia 上進行測試,這個架構必須解決兩個問題

  • 找出與地點對應的檢視畫面
  • 尋找位於該位置的檢視中的節點

無障礙管理員會從風景接收指標事件 (詳情請參閱無障礙輸入說明文件)。畫面會為每個指標事件加上註解,並以與所含檢視區塊的 viewRef 相關聯的 KOID (核心物件 ID) 來加上註解。如此一來,螢幕閱讀器就能將觸控動作對應到特定語意樹狀結構,並將觸控路徑轉送至正確的 SemanticListener 進行命中測試。命中測試動作的說明如下。

語意事件監聽器動作

UI 架構提供的 Semantic Listener 可讓無障礙架構在用戶端檢視畫面中執行動作。這些憑證可為架構提供資訊 (例如使用命中測試判斷使用者輕觸哪個節點),或在用戶端檢視畫面中進行變更 (例如使用點選按鈕的預設動作)。以下是支援的事件監聽器動作 (請參閱 API 中的「動作」列舉):

  • 命中測試 - 使用檢視畫面本機 (x,y) 座標的架構查詢,以及用戶端檢視畫面,會傳回位於該位置的節點 ID,以及 (選用) 從樹狀結構根層級通往該節點的路徑。
  • 預設動作:接受節點 ID 做為輸入值。這與輕觸或點選按鈕的邏輯相同
  • 顯示在畫面上 - 接受節點 ID 做為輸入內容。捲動 UI,顯示該節點。用戶端檢視畫面會負責決定其確切做法。
  • 遞增/遞減 - 調整滑桿目前的值。

樹狀結構導覽與排序

無障礙架構提供基本公用程式,方便您在樹狀結構中尋找下一個或先前的節點,以便瀏覽檢視畫面的語意樹狀結構。這樣就能透過 UI 進行線性導覽。這項瀏覽作業會依序進行。

呼叫端可為下一個/上一個函式提供篩選器函式,以允許疊代整個特定類型的所有節點,例如標頭、連結等。這也可用來略過根據特定指標無法「描述」的節點。