Silverlight 的多點觸摸(MultiTouch)
北京時間2012年2月16日,寶威科技援引豆豆網(wǎng)資訊 多點觸控輸入是一種輸入類型,它依賴于觸摸屏輸入概念,還可能依賴多種觸控及其被解釋為單元(有時也稱為幀)的特征。多點觸控輸入需要有對觸控敏感的硬件,以及支持將觸控事件向各應(yīng)用程序公開所需基礎(chǔ)結(jié)構(gòu)的環(huán)境。本主題討論 Silverlight 中對多點觸控的支持,并介紹幾個關(guān)鍵概念。
多點觸控硬件
多點觸控這一概念需要能夠記錄表面上所產(chǎn)生觸壓的硬件。該表面可以直接是屏幕(如 Tablet PC 設(shè)備),也可以是單獨的專用輸入設(shè)備(如繪圖板)。其中,Tablet PC 設(shè)備或類似的顯示屏直接對觸控敏感的設(shè)備通常與 Silverlight 關(guān)聯(lián)最大。
平臺要求
多點觸控需要有能夠?qū)⒂|摸屏輸入傳播到某一個應(yīng)用程序(如基于 Silverlight 的應(yīng)用程序)的環(huán)境(平臺和操作系統(tǒng)、諸如瀏覽器等的宿主應(yīng)用程序)。
在操作系統(tǒng)級別上,Windows 7 支持多點觸控輸入。一部分是通過消息 WM_TOUCH 來支持的。該操作系統(tǒng)已在此級別將多點觸控消息提升為鼠標(biāo)消息,由此使多點觸控用戶在與可能不具觸控識別能力,而是通過鼠標(biāo)事件/消息執(zhí)行其所有空間輸入處理的應(yīng)用程序進行交互時,可以使用觸控和筆勢來代替鼠標(biāo)移動或鼠標(biāo)單擊。Windows 7 還可在適當(dāng)時合并這些消息。
I nternet Explorer 版本 8 作為宿主也是能識別多點觸控的,它轉(zhuǎn)發(fā)平臺多點觸控消息的方式為:插件(如 Silverlight)可以與宿主中的多點觸控交互。
Silverlight 的多點觸控輸入
注冊多點觸控作為操作系統(tǒng)的多點觸控設(shè)計的一部分,每個希望獨立接收多點觸控消息的應(yīng)用程序必須注冊其 HWND(為此,Windows 7 的觸控 API 包含 RegisterTouchWindow)。對于整個 Silverlight 和所有將 Silverlight 用作運行時的應(yīng)用程序,Silverlight 編程環(huán)境負責(zé)此注冊步驟。因此,通常不需要直接與平臺代碼交互來處理多點觸控輸入。但是,由 Silverlight 為自身注冊多點觸控的方式所聲明的多點觸控交互的特有特征是相當(dāng)具有特定性的:
Silverlight 注冊原始觸控輸入,而不注冊筆勢。如果需要包含筆勢,您必須在 Silverlight 的上下文中使用自己的應(yīng)用程序代碼將觸摸屏輸入處理為筆勢。此外,還需要進行更大規(guī)模的互操作設(shè)計,以便您可以在其中包含一個單獨的 HWND,它將從平臺進行筆勢的多點觸控注冊,并且與 Silverlight 內(nèi)容區(qū)域進行互操作。
通常,Silverlight 將原始觸摸屏輸入提升至鼠標(biāo)事件。(但是,可以基于每個觸控幀禁用提升,在本主題的下面幾節(jié)中將會說明。)
提升至鼠標(biāo)事件
鼠標(biāo)事件提升使多點觸控用戶在與可能不具觸控識別能力,而是通過鼠標(biāo)事件/消息執(zhí)行其所有空間輸入處理的應(yīng)用程序進行交互時,可以使用觸控和筆勢來代替鼠標(biāo)移動或鼠標(biāo)單擊。從概念上說這是默認的,因為先前的應(yīng)用程序或不考慮多點觸控的應(yīng)用程序不知道要調(diào)用哪個 API 來執(zhí)行該提升,所以在大多數(shù)情況下由平臺來執(zhí)行鼠標(biāo)提升。出于大部分都相同的原因,Silverlight 保留了鼠標(biāo)事件提升的一般概念。任何給定的現(xiàn)有 Silverlight 控件都可能具有鼠標(biāo)事件的處理程序,但不是專門用于多點觸控事件的。例如,當(dāng)用戶使用多點觸控設(shè)備與按鈕交互時,按鈕的預(yù)期行為與鼠標(biāo)單擊時的相同。
如果有專門用于多點觸控幀及其觸控點的處理,鼠標(biāo)事件提升的確可能實現(xiàn)雙重事件。在 Silverlight 的多點觸控事件處理程序正文中,可以在主向下觸控操作期間掛起鼠標(biāo)事件提升。例如,如果要創(chuàng)建一個可識別觸摸的按鈕,該按鈕根據(jù)觸摸特征執(zhí)行不同的操作,則您可以掛起提升,以使該按鈕不提升至通常的"單擊"行為,而是根據(jù)處理輸入的方式進入不同的代碼路徑。為此,請調(diào)用 SuspendMousePromotionUntilTouchUp 作為處理程序最初的操作之一。
鼠標(biāo)提升的具體特性不在此討論,因為這是平臺特征。一般說來,該機制是消息到消息的提升。
將觸控處理為筆勢
Silverlight 在原始消息級別上處理多點觸控消息,類似于平臺 WM_TOUCH,它還在該原始級別上處理對可捕獲觸控點特征的其他 API 的訪問,并將這些 API 作為 Silverlight API 公開。Silverlight 本身不會將觸控處理為筆勢,請使用平臺功能實現(xiàn)該效果,或者處理 WM_GESTURE。(處理 WM_GESTURE 需要處于平臺注冊狀態(tài),而 Silverlight 不會自動選擇該狀態(tài)。)
如果要使用筆勢比喻處理多點觸控,代碼中必須處理觸控事件并使用 Silverlight 下公開的 API 將其處理為筆勢,可以使用也可以不使用筆勢的平臺 API。這一點無關(guān)緊要。
觸控 API
多點觸控輸入與 Silverlight 中支持的其他輸入方法(鼠標(biāo)、鍵盤、觸筆)之間的一個主要差異在于,注冊多點觸控事件是基于應(yīng)用程序范圍的,而不是向特定輸入元素(UIElement 對象)添加處理程序。這與 Silverlight 整體上是向平臺注冊的"應(yīng)用程序"這一比喻一致的。
指定多點觸控事件處理程序的方法是為靜態(tài)事件 Touch..::..FrameReported 指定一個處理程序。System.Windows.Input..::..Touch 是一個只出于目的而存在的靜態(tài)服務(wù)類,Touch..::..FrameReported 是其僅有的 API。
為 Touch..::..FrameReported 編寫的處理程序基于 TouchFrameEventHandler 委托。
在典型的 UI 設(shè)計中,可能會有一個要在其中支持特定多點觸控操作的 UI 區(qū)域,還會有最好在其中使用鼠標(biāo)提升而不一定要將輸入處理為多點觸控的其他區(qū)域。若要確定主觸控點的位置,必須針對可識別多點觸控的元素的位置及其邊界計算整個坐標(biāo)。有關(guān)更多信息及代碼示例,請參見 GetPrimaryTouchPoint。
如上所述,作為 TouchFrameEventHandler 邏輯的一部分,您可能需要掛起鼠標(biāo)事件提升。為此,請調(diào)用 SuspendMousePromotionUntilTouchUp 作為最初的操作之一。
向 Silverlight 報告的觸控消息通常組合為幀,這些幀以主"向下"觸控點開始。有時候您可能只對第一個觸控點和第一個"向上"操作感興趣,但幀可能包含其他觸控點和"移動"操作。若要在處理程序中訪問幀中各點的完整集合,請調(diào)用 GetTouchPoints。對于給定的觸控點,最重要的信息可能是其 Position。
在平臺 API 中公開信息的其他 API 可在 TOUCHINPUT 結(jié)構(gòu)中找到。這些 API 的示例有:TouchFrameEventArgs..::..Timestamp;TouchDevice..::..DirectlyOver;TouchPoint..::..Size;TouchPoint..::..TouchDevice。隨方案不同,可能不會始終需要此級別的信息。
1: public MainPage()
2: {
3: InitializeComponent();
4: Touch.FrameReported += new TouchFrameEventHandler(Touch_FrameReported);
5: }
6:
7: void Touch_FrameReported(object sender, TouchFrameEventArgs e)
8: {
9: foreach (TouchPoint tp in e.GetTouchPoints(this.Positions))
10: {
11: if (tp.Action == TouchAction.Down)
12: {
13: // do something
14: }
15: }
16: }