觸控事件處理

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

基本觸控事件的處理方式,與 ActionScript 處理其他事件的方式相同 (例如滑鼠事件)。您可以偵聽 TouchEvent 類別 中之事件類型常數所定義的一連串觸控事件。
備註: 針對多個觸控點輸入 (例如使用多根手指觸控裝置),第一個接觸點會傳送滑鼠事件和觸控事件。
處理基本觸控事件:
  1. flash.ui.Multitouch.inputMode 屬性設為 MultitouchInputMode.TOUCH_POINT ,以設定應用程式來處理觸控事件。

  2. 將事件偵聽程式連接至類別實體,而此類別是繼承 InteractiveObject 類別 (例如 Sprite 或 TextField) 的屬性。

  3. 指定要處理的觸控事件類型。

  4. 呼叫事件處理常式函數,以執行回應事件的作業。

例如,下列程式碼會在觸控螢幕內 mySprite 中繪製的正方形被點選時顯示訊息:

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, taphandler); 
 
function taphandler(evt:TouchEvent): void { 
    myTextField.text = "I've been tapped"; 
    myTextField.y = 50; 
    addChild(myTextField); 
}

觸控事件屬性

發生事件時,會建立事件物件。TouchEvent 物件包含的資訊,是有關觸控事件的位置和條件。您可以使用事件物件的屬性來擷取該資訊。

例如,下列程式碼會建立 TouchEvent 物件 evt ,然後在文字欄位中顯示事件物件的 stageX 屬性 (「舞台」空間中觸控發生點的 x 座標):

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, taphandler); 
 
function taphandler(evt:TouchEvent): void { 
myTextField.text = evt.stageX.toString; 
myTextField.y = 50; 
addChild(myTextField); 
}
請參閱 TouchEvent 類別,取得事件物件可用屬性的詳細資訊。
備註: 在所有執行階段環境中,並非支援所有 TouchEvent 屬性。例如,並非所有觸控裝置都可以偵測使用者施予觸控螢幕的壓力。因此,無法偵測壓力的裝置就不支援 TouchEvent.pressure 屬性。嘗試測試特定屬性支援,以確保應用程式可以運作,並參閱 疑難排解 ,以取得詳細資訊。

觸控事件階段

在 InteractiveObject 上和外部,透過各種舞台來追蹤觸控事件,就像處理滑鼠事件一樣。而且,透過觸控互動的開始、中間和結束,來追蹤觸控事件。TouchEvent 類別提供的值可用來處理 touchBegin touchMove touchEnd 事件。

例如,您可以使用 touchBegin touchMove touchEnd 事件,在使用者觸碰和移動顯示物件時提供視覺回應:

Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT; 
var mySprite:Sprite = new Sprite(); 
mySprite.graphics.beginFill(0x336699); 
mySprite.graphics.drawRect(0,0,40,40); 
addChild(mySprite); 
var myTextField:TextField = new TextField(); 
myTextField.width = 200; 
myTextField.height = 20; 
addChild(myTextField); 
 
mySprite.addEventListener(TouchEvent.TOUCH_BEGIN, onTouchBegin); 
stage.addEventListener(TouchEvent.TOUCH_MOVE, onTouchMove); 
stage.addEventListener(TouchEvent.TOUCH_END, onTouchEnd); 
function onTouchBegin(event:TouchEvent) { 
    myTextField.text = "touch begin" + event.touchPointID; 
} 
function onTouchMove(event:TouchEvent) { 
    myTextField.text = "touch move" + event.touchPointID; 
} 
function onTouchEnd(event:TouchEvent) { 
    myTextField.text = "touch end" + event.touchPointID; 
}
備註: 初始觸控偵聽程式會連接至 mySprite,但是移動和結束觸控事件的偵聽程式則否。如果使用者的手指或指標裝置移動到顯示物件的前面,則「舞台」還是會繼續偵聽觸控事件。

觸控點 ID

TouchEvent.touchPointID 屬性是撰寫回應觸控輸入之應用程式的必要部分。Flash 執行階段會將唯一的 touchPointID 值指定給每個觸控點。只要應用程式回應觸控輸入的階段或移動,就會先檢查 touchPointID ,再處理事件。Sprite 類別的觸控輸入拖曳方法,使用 touchPointID 屬性做為參數,來處理正確的輸入實體。 touchPointID 屬性可確保事件處理常式回應正確的觸控點。否則,事件處理常式會回應裝置上觸控事件類型的所有實體 (例如所有 touchMove 事件),進而產生無法預測的行為。在使用者拖曳物件時,這個屬性特別重要。

touchPointID 屬性可用來管理整個觸控序列。觸控序列具有一個 touchBegin 事件、零個或以上的 touchMove 事件,以及一個具有相同 touchPointID 值的 touchEnd 事件。

下列範例會先建立 touchMoveID 變數以測試正確的 touchPointID 值,再回應觸控移動事件。否則,其他觸控輸入也會觸發事件處理常式。請注意,適用於移動和結束階段的偵聽程式位於舞台上,而不是顯示物件。如果使用者的觸控移動超出顯示物件的界限,則舞台會偵聽移動或結束階段。
Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT; 
var mySprite:Sprite = new Sprite(); 
mySprite.graphics.beginFill(0x336699); 
mySprite.graphics.drawRect(0,0,40,40); 
addChild(mySprite); 
var myTextField:TextField = new TextField(); 
addChild(myTextField); 
myTextField.width = 200; 
myTextField.height = 20; 
var touchMoveID:int = 0; 
 
mySprite.addEventListener(TouchEvent.TOUCH_BEGIN, onTouchBegin); 
function onTouchBegin(event:TouchEvent) { 
    if(touchMoveID != 0) { 
        myTextField.text = "already moving. ignoring new touch";     
        return; 
    } 
    touchMoveID = event.touchPointID; 
 
    myTextField.text = "touch begin" + event.touchPointID; 
    stage.addEventListener(TouchEvent.TOUCH_MOVE, onTouchMove); 
    stage.addEventListener(TouchEvent.TOUCH_END, onTouchEnd); 
} 
function onTouchMove(event:TouchEvent) { 
    if(event.touchPointID != touchMoveID) { 
        myTextField.text = "ignoring unrelated touch"; 
        return; 
    } 
    mySprite.x = event.stageX; 
    mySprite.y = event.stageY; 
    myTextField.text = "touch move" + event.touchPointID; 
} 
function onTouchEnd(event:TouchEvent) { 
    if(event.touchPointID != touchMoveID) { 
        myTextField.text = "ignoring unrelated touch end"; 
        return; 
    } 
    touchMoveID = 0; 
    stage.removeEventListener(TouchEvent.TOUCH_MOVE, onTouchMove); 
    stage.removeEventListener(TouchEvent.TOUCH_END, onTouchEnd); 
    myTextField.text = "touch end" + event.touchPointID; 
}