警告
本文件已被歸檔,且該元件目前版本的 Windows 社群工具包中無法取得。
雖然目前沒有立即將此元件移植到 8.x,但社群歡迎表達興趣或參與其納入。
如需詳細資訊,請參閱:
以下是原始文件。
Microsoft 宣布在Windows 10 秋季創作者更新中,將提供原生支援的眼動追蹤功能。 在 2018 年 4 月的 Windows 10 更新中,Microsoft 透過釋出 Windows Gaze Input API ,加入開發者支援,以建立能與視線輸入及眼動追蹤互動的 UWP 應用程式。
此凝視互動函式庫建置於 Windows 凝視輸入 API 之上,並提供一組開發者輔助類別,讓 UWP 應用程式更容易回應使用者在螢幕上的視線。 此函式庫旨在抽象化處理透過 Windows API 提供的眼動追蹤裝置原始視線輸入流的某些複雜性。
先決條件
要使用 Windows 10 的凝視輸入 API 或此凝視互動函式庫,您需要具備以下條件:
- 搭載 Windows 10 2018 年 4 月更新的裝置
- 支援的 眼動追蹤器,如 Tobii EyeX 4C
要使用 gaze input API,必須在應用程式清單中註冊 gazeInput 功能。 在您的專案中的 Package.appxmanifest 檔案內的 Capabilities 節點新增以下 DeviceCapability(當您在 Visual Studio 的 App Manifest Designer 開啟 Package.appxmanifest 時,可以在 Capabilities 標籤勾選 Gaze Input):
<Capabilities>
<DeviceCapability Name="gazeInput" />
</Capabilities>
支援的功能
凝視互動函式庫目前支援以下功能:
- 基於停留啟動的 XAML 按鈕和切換按鈕控制
- 啟用整個 XAML 頁面或部分(例如單一控制項)的凝視互動
- 自訂特定控制項的停留時間
- 控制重複的停留呼叫
凝視概念
以下是幾個與眼神凝視相關的概念,有助於更好地理解本文的其餘內容:
- 薩卡德。 眼睛快速從一個注視點移動到另一個注視點的過程稱為掃視。 我們的眼睛會在注視和掃視之間交替。
- 執著。 凝視是指在螢幕單一位置集中多個視點,持續相對較短的時間(約200毫秒)。 這發生在掃視後,當眼睛停留在物體上時,視覺會變得清晰。
- 停留。 停留是指使用者有意識地注視,其持續時間超過固定注視的時間。 當使用者僅用眼睛作為輸入方式時,這種機制通常用來辨識使用者的意圖。 停留時間可依應用與控制而異。
- 進入/退出。 這些是此 API 專屬的狀態與屬性,用以協助管理凝視相關互動,並參考自第一個記錄的凝視取樣到最後一次記錄的凝視取樣以來,特定控制(按鈕、切換按鈕等)所經過的時間。
凝視互動函式庫透過讀取眼動追蹤器上的數據,來實現頁面上的停留式凝視互動,當使用者的視線在特定控制項上停留特定時間時,觸發該控制項。 應用程式可根據使用情境設定此時間。
指標狀態屬性
Windows 的凝視輸入 API 會提供一串帶有時間戳記的凝視點座標,顯示使用者在螢幕上的位置。 此函式庫將這些樣本彙整於每個控制項,並將串流轉換為凝視事件。 與這些事件相對應的狀態如下:
| 房產 | 類型 | Description |
|---|---|---|
| 請輸入 | 列舉 | 使用者的目光進入了控制系統 |
| 固定 | 列舉 | 使用者的眼睛會聚焦在控制器上。 |
| 居住 | 列舉 | 使用者有意識地停留在控制狀態,且已超過停留時間。 這被解讀為使用者意圖啟動或呼叫控制,例如點擊按鈕 |
| Exit | 列舉 | 使用者的視線已不再受控 |
GazeInput 屬性
若 XAML 頁面啟用以凝視互動,則可透過以下屬性設定凝視游標的可見性、大小,以及上述狀態相關的時序:
| 房產 | 類型 | Description |
|---|---|---|
| IsDevice可用 | 布爾 (bool) | 回傳是否連接相容的眼動追蹤器。 當這個屬性改變時,會觸發一個 IsDeviceAvailableChanged 事件。 |
| 互動 | 列舉 | 取得或設定該特定 XAML 元素的凝視互動狀態。 有三種選擇:
|
| 游標可見 | 布爾 (bool) | 凝視游標顯示使用者在螢幕上看的方向。 此布林屬性在設定為 時 true 顯示視線游標,設定為 false時則隱藏。 預設值為 false |
| 游標半徑 | 整數 (int) | 取得或設定凝視游標半徑的大小。 預設值為 X |
| 閾值持續時間 | TimeSpan | 此持續時間控制指示狀態何時移動到 Enter 狀態或 Exit 狀態。 當使用者的目光首次進入一個控制元件PointerState之後,當此持續時間已過時,則設為Enter。 當使用者視線離開控制器後,經過這段時間,PointerState 將被設定為 Exit。 兩種情況下,事件 StateChanged 都會被觸發。 預設值是 50ms。 |
| 凝視持續時間 | TimeSpan | 取得或設定控制從該 Enter 狀態轉換到該 Fixation 狀態的持續時間。 當前會觸發StateChanged事件,並將PointerState設定為Fixation。 此事件應用來控制應用程式所需的最早視覺反饋,以向使用者提供有關凝視位置的資訊。 預設值是 350ms。 |
| 停留持續時間 | TimeSpan | 取得或設定控制從該 Fixation 狀態轉換到該 Dwell 狀態的持續時間。 此時,StateChanged 事件被觸發,並將 PointerState 設定為 Dwell。
Enter與Fixation狀態通常達成得很快,使用者很難控制。 相較之下,Dwell 是一項更有意識的活動。 此時控制項會被呼叫,例如按鈕點擊。 應用程式可以修改這個屬性,以控制啟用視線的 UI 元素在使用者開始查看後何時被觸發。 預設值是 400 毫秒。 |
| MaxDwell重複計數 | 整數 (int) | 控制鍵最多可重複觸發,使用者視線不需移開再回到控制鍵。 預設值為零,這會使控制項無法重複呼叫。 開發者可以設定較高的值來啟用重複呼叫。 |
| 停留重複持續時間 | TimeSpan | 若使用者持續停留在控制上,則可取得或設定重複觸發停留動作的持續時間。 第一次重複將在RepeatDelayDuration所指定的額外延遲之後發生。 後續重複會在DwellRepeatDuration每個週期後發生。
只有當 MaxDwellRepeatCount 設為大於零時,控制項才會被反覆呼叫。 |
| 重複延遲持續時間 | TimeSpan | 取得或設定第一次重複發生的額外持續時間。 這可防止無意中重複召喚。 請參閱上方詳細說明。 |
| IsSwitchEnabled(開關是否啟用) | 布爾 (bool) | 可以獲取或設定開關是否啟用。 啟用 Switch 支援時,目前固定的元素不會轉換成停留狀態。 此外,當 GazePointer.Click() 方法被呼叫時,會呼叫目前固定的元素。 |
GazeElement 事件
請在此補充說明。
| 活動 | Description |
|---|---|
| 狀態已變更 | 此事件是針對與 PointerState 相關的各個狀態(排除 DwellRepeat 狀態)而觸發的。 應用程式可以為此事件新增處理程序,以針對上述各種凝視指標狀態自訂與凝視相關的處理。 |
| DwellProgressFeedback | 當此事件觸發時,表示停留事件的進展情況。 應用程式可以處理此事件,透過將 DwellProgressEventArgs.Handled 設定為 true 來自訂視覺回饋和/或關閉預設的停留動畫。 |
| 召喚 | 當程式庫即將因應停留事件而呼叫控制時,此事件會觸發。 應用程式可以在調用前執行自訂處理,或透過設定DwellInvokedRoutedEventArgs.Handled為true來抑制調用。 |
StateChangedEventArgs 屬性
這個參數會傳遞給 StateChanged 事件,當事件變更 PointerState 時會觸發。
| 房產 | 類型 | Description |
|---|---|---|
| 指標狀態 | 凝視指標狀態 |
GazePointerState與此活動相關的 |
| 經過時間 | TimeSpan | 使用者為達到上述指標狀態,所花在觀察控制項的時間 |
DwellProgressEventArgs 屬性
此參數會傳遞給處理該 DwellProgressFeedback 事件的事件。
| 房產 | 類型 | Description |
|---|---|---|
| State | 列舉 | 此枚舉列舉了控制狀態,該狀態在三個值 Idle、Progressing 和 Complete 之間停留 |
| Progress | 雙倍 | 介於0到1之間的值表示完成停留的進度分數 |
| 已處理 | 布爾 (bool) | 若應用程式將此值設為 true 預設值,函式庫提供的動畫會被抑制 |
DwellInvokedRoutedEventArgs 屬性
此參數會傳遞給 GazeElement::Invoked 事件,並允許應用程式在使用者停留在控制項時避免預設調用。
| 房產 | 類型 | Description |
|---|---|---|
| 已處理 | 布爾 (bool) | 此參數被傳遞給 GazeElement.Invoked 事件。 若設定為true,函式庫將在停留事件中抑制調用控制。 |
範例
為整個 XAML 頁面啟用視線互動
在頁面元素中加入以下線條,以實現整頁的視線互動。
xmlns:gaze="using:Microsoft.Toolkit.Uwp.Input.GazeInteraction"
gaze:GazeInput.Interaction="Enabled"
例如:
<Page
x:Class="UwpApp.MainPage"
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="https://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="https://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:gaze="using:Microsoft.Toolkit.Uwp.Input.GazeInteraction"
gaze:GazeInput.Interaction="Enabled"
mc:Ignorable="d">
在頁面的一部分中啟用視線互動
凝視互動也只能在頁面的一部分啟用,方法是將相同的屬性加入頁面上的任何 XAML 元素。
若要僅啟用頁面的子集,例如頁面上僅有一個格子:
<Grid gaze:GazeInput.Interaction="Enabled">
<Button Content="Click Me" />
<Grid />
在上述範例中,當使用者在網格中注視按鈕並且停留時間達到預設的時長時,按鈕會被點擊。
更改控制項的停留時間
以下程式碼將按鈕的停留時間設定為 500ms。 這表示按鈕會在控制進入固定狀態後 500 毫秒被點擊。 (詳情請參見 PointerState )
<Button Content="Click Me" gaze:GazeInput.DwellDuration="00:00:00.500">
動畫
此函式庫提供控制項上方縮小矩形的預設動畫,表示停留事件的進度。 動畫風格可透過兩種方式自訂:
- 如果你想保留動畫風格,但改變使用的顏色:
- 設定
GazeInput.DwellFeedbackEnterBrush屬性,以便在偵測到凝視時立即在控制元件上顯示矩形。 - 更改
GazeInput.DwellFeedbackProgressBrush屬性以改變進度矩形的顏色 - 更改
GazeInput.DwellFeedbackCompletedBrush屬性以改變完成畫筆的顏色
- 設定
- 如果你想完全停用或覆寫預設動畫,請新增一個事件處理程序,
DwellProgressFeedbackGazeElement並設定Handled為True如下
<Button Content="Click Me">
<gaze:GazeInput.GazeElement>
<gaze:GazeElement DwellProgressFeedback="OnInvokeProgress" />
</gaze:GazeInput.GazeElement>
</Button>
private void OnInvokeProgress(object sender, DwellProgressEventArgs e)
{
e.Handled = true;
}
範例專案
凝視互動頁面。 你可以在 Windows 社群工具包範例應用程式中看到這個功能的運作。
需求
| 裝置系列 | Universal,10.0.17134.1 或更高 |
|---|---|
| Namespace | Microsoft.Toolkit.Uwp.Input.GazeInteraction |
| NuGet 套件 | NuGet 套件 |