觸控事件處理

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 類別提供的值可用來處理 touchBegintouchMovetouchEnd 事件。

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

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; 
}