首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

Windows 7 多點觸控進階實戰:操作處理器與慣性模擬打造 Surface 級圖片操作體驗

     編輯:關於.NET

前言:從單點觸控到自然使用者介面 (NUI)

前兩篇實驗分別介紹 WM_GESTURE(高階手勢)與 WM_TOUCH(原始觸點)。本實驗進階運用 Manipulation Processor(操作處理器)與 Inertia Processor(慣性處理器),將簡單滑鼠式圖片拖曳升級為支援多指同時平移、縮放、旋轉、慣性滑動的 Surface 級自然操作體驗。

開發環境與架構

  • Visual Studio 2008 SP1 + Windows 7 SDK
  • Windows 7 Integration Library 範例(提供 Managed 封裝)
  • WPF 應用程式,主視窗含 Canvas 載入多張圖片

核心元件介紹

  • ManipulationProcessor (COM):接收觸點 ID + 座標事件,輸出 ManipulationDelta(平移/旋轉/縮放增量)、ManipulationStarted/Completed 事件
  • InertiaProcessor (COM):在手指離開後依初始速度產生慣性事件,模擬物理摩擦停止
  • ManipulationInertiaProcessor:整合兩者的 Managed 封裝,需 GUI 計時器驅動

實作階段詳解

階段一:多圖片觸點追蹤管理 (PictureTrackerManager)

  • 使用 Dictionary<int, PictureTracker> 對應觸點 ID 與追蹤器
  • GetPictureTracker(touchId, location) 邏輯:
    1. 已追蹤該 touchId → 直接回傳
    2. 觸點位置下有圖片 → 檢查該圖片是否已被其他 touchId 追蹤
    3. 首次接觸 → 建立新 PictureTracker、將圖片提至最上層 (Z-index)
  • 將 StylusDown/Move/Up 事件轉發至對應 PictureTracker

階段二:引入 ManipulationProcessor (PictureTracker 重構)

  • 每個 PictureTracker 內建 ManipulationProcessor(ProcessorManipulations.ALL)
  • 建構函數註冊三大事件:
    • ManipulationStarted:記錄日誌
    • ManipulationDelta:核心邏輯 —— 套用 TranslationDelta (平移)、RotationDelta (旋轉)、ScaleDelta (縮放) 至圖片屬性
    • ManipulationCompleted:記錄日誌
  • ProcessDown/Move/Up 呼叫 _processor.ProcessDown/Move/Up(touchId, location)
  • 命名空間:Windows7.Multitouch.Manipulation、Windows7.Multitouch.WPF(含 ToDrawingPointF() 擴充方法)

階段三:PictureTracker 物件池優化

  • PictureTrackerManager 加入 Stack<PictureTracker> _pictureTrackers 快取
  • GetPictureTracker 優先從堆疊取出重用,空才新建
  • PictureTracker 建構函數接收 PictureTrackerManager 參考
  • ManipulationCompleted 事件中呼叫 manager.Completed(this) 歸還池中

階段四:加入慣性模擬 (Inertia)

  • 將 ManipulationProcessor 替換為 ManipulationInertiaProcessor(ALL, Factory.CreateTimer())
  • 新增 InertiaParam 內部類別追蹤速度:
    • InitialVelocity (平移)、InitialAngularVelocity (旋轉)、InitialExpansionVelocity (縮放)
    • 使用 Stopwatch 計算單位時間位移 → 速度
    • Update(ManipulationDeltaEventArgs, history) 以加權平均平滑速度估算
  • ManipulationStarted 呼叫 _inertiaParam.Reset()
  • 註冊 BeforeInertia 事件 (OnBeforeInertia):
    • 通知 Manager 進入慣性階段 (InInertia 移除所有該追蹤器的 touchId 對應)
    • 設定慣性參數:InertiaTimerInterval=15ms、MaxInertiaSteps=500
    • 初始速度 ← _inertiaParam 估算值
    • 期望位移/旋轉/縮放量依經驗公式設定(如位移 = 速度 × 250)
  • ManipulationCompleted 呼叫 _inertiaParam.Stop() 並歸還池

關鍵設計細節

  1. 觸點與追蹤器解耦:Manager 維護對應關係,Tracker 專注單一物件操作邏輯
  2. Z-index 管理:BringPictureToFront 確保被操作圖片浮至最上層
  3. 慣性階段的觸點清理:InInertia 從對應表移除 touchId,避免新觸點干擾慣性動畫,但保留 Tracker 直到慣性結束
  4. 速度估算平滑化:引入 history 參數 (0.9) 做指數移動平均,避免單幀抖動
  5. GUI 計時器驅動慣性:Factory.CreateTimer() 確保慣性事件在 UI 執行緒觸發,避免跨執行緒問題

執行與調整

編譯執行後,嘗試:

  • 多指同時操作多張圖片(平移/縮放/旋轉同步進行)
  • 快速甩動圖片觀察慣性滑動與自然停止
  • 調整 DesiredDisplacement、MaxInertiaSteps 等參數改變慣性手感

總結

本實驗層層遞進展示 Windows 7 多點觸控高階程式設計精華:ManipulationProcessor 將雜亂觸點轉化為語義化操作增量,InertiaProcessor 賦予虛擬物件真實物理感,物件池模式優化資源管理。這套技術組合是打造自然使用者介面 (NUI) 的核心基石,廣泛應用於 Surface、Kinect 及現代觸控應用開發中。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved