疑難排解

Flash Player 10.1 以及更新的版本,Adobe AIR 2 以及更新的版本

觸控輸入之硬體和軟體支援的變更速度極為快速。這項參考不會列出支援多點觸控之作業系統和軟體組合的每個裝置清單。不過,它提供使用探索 API 的準則,來判斷您的應用程式是否部署於支援多點觸控的裝置,以及提供 ActionScript 程式碼的疑難排解提示。

Flash 執行階段會根據裝置、作業系統或包含軟體 (例如瀏覽器) 傳遞給執行階段的資訊,來回應觸控事件。軟體環境上的這個依存關係,讓製作多點觸控相容性的說明文件更形複雜。部分裝置解譯手勢或觸控動作的方式會與其他裝置不同。旋轉是否透過同時旋轉兩根手指來定義?旋轉一根手指是否在螢幕上繪製圓形?根據硬體和軟體環境,旋轉手勢可能是上述情況之一,但有時則完全不同。因此,裝置會將使用者輸入告知作業系統,然後作業系統將該資訊傳遞給執行階段。如果執行階段位於瀏覽器,則瀏覽器軟體有時會解譯手勢或觸控事件,而且不會將輸入傳遞給執行階段。這種行為與「快速鍵」的行為類似:您會嘗試使用特定的按鍵組合讓 Flash Player 在瀏覽器內執行某個作業,而瀏覽器反而會一直開啟某個功能表。

個別的 API 和類別若與特定作業系統不相容,則會特別說明。您可以在此瀏覽個別的 API 項目,從 Multitouch 類別開始: http://help.adobe.com/zh_TW/FlashPlatform/reference/actionscript/3/flash/ui/Multitouch.html

此下是一些常見的手勢和觸控說明:
平移
從左到右或從右到左移動手指。部分裝置需要兩根手指才能進行平移。

旋轉
用兩根手指觸控,然後將它們以圓形移動 (就像它們同時追蹤表面上的假想圓形)。而樞紐點會設定於兩根手指觸控點之間的中點。

揮動
快速從左到右或從右到左、從上到下或從下到上移動三根手指。

縮放
用兩根手指觸控,然後將它們移離彼此以放大顯示,移近彼此以縮小顯示。

按下並輕點
移動或按下一根手指,然後使用另一根手指輕點表面。

每個裝置都有該裝置所支援之手勢的文件,以及如何在該裝置上執行每個手勢的文件。一般而言,使用者必須在手勢之間,讓所有手指離開接觸的裝置 (視作業系統而定)。

如果您發現應用程式未回應觸控事件或手勢,請測試下列項目:
  1. 觸控或手勢事件連接至繼承自 InteractiveObject 類別的物件類別,而您是否為該事件設定事件偵聽程式?只有 InteractiveObject 實體才能偵聽觸控和手勢事件。

  2. 您是否在 Flash Professional CS5 內測試應用程式?如果是這樣,因為 Flash Professional 可以攔截互動,請嘗試發佈和測試應用程式。

  3. 先從簡單的開始,並查看哪一項會發生作用 (下列程式碼範例是來自 Multitouch.inputMode 的 API 項目):

    Multitouch.inputMode=MultitouchInputMode.TOUCH_POINT; 
    var mySprite:Sprite = new Sprite(); 
    var myTextField:TextField = new TextField() 
     
    mySprite.graphics.beginFill(0x336699); 
    mySprite.graphics.drawRect(0,0,40,40); 
    addChild(mySprite); 
     
    mySprite.addEventListener(TouchEvent.TOUCH_TAP, taplistener); 
     
    function taplistener(e:TouchEvent): void { 
        myTextField.text = "I've been tapped"; 
        myTextField.y = 50; 
        addChild(myTextField); 
    }

    點選矩形。如果這個範例可行,便可以知道環境支援簡單點選。然後,您可以嘗試較複雜的處理。

    手勢支援的測試較為複雜。個別的裝置或作業系統支援任何手勢輸入組合,或不支援任何輸入。

    以下是縮放手勢的簡單測試:

    Multitouch.inputMode = MultitouchInputMode.GESTURE; 
     
    stage.addEventListener(TransformGestureEvent.GESTURE_ZOOM , onZoom); 
    var myTextField = new TextField(); 
    myTextField.y = 200; 
    myTextField.text = "Perform a zoom gesture"; 
    addChild(myTextField); 
     
    function onZoom(evt:TransformGestureEvent):void { 
        myTextField.text = "Zoom is supported"; 
    }

    在裝置上執行縮放手勢,並查看文字欄位是否填入 Zoom is supported 訊息。事件偵聽程式會新增至舞台,所以您可以在測試應用程式的任何部分執行手勢。

    以下是平移手勢的簡單測試:

    Multitouch.inputMode = MultitouchInputMode.GESTURE; 
     
    stage.addEventListener(TransformGestureEvent.GESTURE_PAN , onPan); 
    var myTextField = new TextField(); 
    myTextField.y = 200; 
    myTextField.text = "Perform a pan gesture"; 
    addChild(myTextField); 
     
    function onPan(evt:TransformGestureEvent):void { 
        myTextField.text = "Pan is supported"; 
    }

    在裝置上執行平移手勢,並查看文字欄位是否填入 Pan is supported 訊息。事件偵聽程式會新增至舞台,所以您可以在測試應用程式的任何部分執行手勢。

    有些作業系統和裝置組合支援這兩種手勢,有些只支援其中一種,有些兩者都不支援。測試應用程式的部署環境,加以確定。

已知問題

下列是觸控輸入的已知問題:
  1. Windows Mobile 作業系統上的行動 Internet Explorer 會自動縮放 SWF 檔案內容:

    將下列項目新增至裝載 SWF 檔案的 HTML 網頁,可覆寫這種 Internet Explorer 縮放行為:

    <head> 
    <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0"> 
    </head>
  2. Windows 7 (或其他作業系統),使用者必須在手勢之間讓指標裝置 (或手指) 離開螢幕。例如,旋轉和縮放影像:
    • 執行旋轉手勢。

    • 讓手指離開螢幕。

    • 將手指放回螢幕,並執行縮放手勢。

  3. Windows 7 (或其他作業系統),如果使用者的手勢非常快,旋轉和縮放手勢不一定會產生「更新」階段。

  4. Windows 7 Starter Edition 不支援多點觸控。如需詳細資訊,請參閱 AIR Labs Forum: http://forums.adobe.com/thread/579180?tstart=0

  5. 如果是 Mac OS 10.5.3 以及更新的版本,則 Multitouch.supportsGestureEvents 值一律會是 true ,即使硬體不支援手勢事件也是一樣。