前兩篇實驗分別介紹 WM_GESTURE(高階手勢)與 WM_TOUCH(原始觸點)。本實驗進階運用 Manipulation Processor(操作處理器)與 Inertia Processor(慣性處理器),將簡單滑鼠式圖片拖曳升級為支援多指同時平移、縮放、旋轉、慣性滑動的 Surface 級自然操作體驗。
Canvas 載入多張圖片ManipulationDelta(平移/旋轉/縮放增量)、ManipulationStarted/Completed 事件PictureTrackerManager)Dictionary<int, PictureTracker> 對應觸點 ID 與追蹤器GetPictureTracker(touchId, location) 邏輯:
PictureTracker、將圖片提至最上層 (Z-index)StylusDown/Move/Up 事件轉發至對應 PictureTrackerPictureTracker 重構)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() 擴充方法)PictureTrackerManager 加入 Stack<PictureTracker> _pictureTrackers 快取GetPictureTracker 優先從堆疊取出重用,空才新建PictureTracker 建構函數接收 PictureTrackerManager 參考ManipulationCompleted 事件中呼叫 manager.Completed(this) 歸還池中ManipulationProcessor 替換為 ManipulationInertiaProcessor(ALL, Factory.CreateTimer())InertiaParam 內部類別追蹤速度:
InitialVelocity (平移)、InitialAngularVelocity (旋轉)、InitialExpansionVelocity (縮放)Stopwatch 計算單位時間位移 → 速度Update(ManipulationDeltaEventArgs, history) 以加權平均平滑速度估算ManipulationStarted 呼叫 _inertiaParam.Reset()BeforeInertia 事件 (OnBeforeInertia):
InInertia 移除所有該追蹤器的 touchId 對應)InertiaTimerInterval=15ms、MaxInertiaSteps=500_inertiaParam 估算值ManipulationCompleted 呼叫 _inertiaParam.Stop() 並歸還池BringPictureToFront 確保被操作圖片浮至最上層InInertia 從對應表移除 touchId,避免新觸點干擾慣性動畫,但保留 Tracker 直到慣性結束history 參數 (0.9) 做指數移動平均,避免單幀抖動Factory.CreateTimer() 確保慣性事件在 UI 執行緒觸發,避免跨執行緒問題編譯執行後,嘗試:
DesiredDisplacement、MaxInertiaSteps 等參數改變慣性手感本實驗層層遞進展示 Windows 7 多點觸控高階程式設計精華:ManipulationProcessor 將雜亂觸點轉化為語義化操作增量,InertiaProcessor 賦予虛擬物件真實物理感,物件池模式優化資源管理。這套技術組合是打造自然使用者介面 (NUI) 的核心基石,廣泛應用於 Surface、Kinect 及現代觸控應用開發中。