手勢事件處理

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

使用與基本觸控事件相同的方式,處理手勢事件。您可以偵聽 TransformGestureEvent 類別、GestureEvent 類別和 PressAndTapGestureEvent 類別中事件類型常數所定義的一連串手勢事件。

若要處理手勢觸控事件:
  1. flash.ui.Multitouch.inputMode 屬性設為 MultitouchInputMode.GESTURE,以設定應用程式來處理手勢輸入。

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

  3. 指定要處理的手勢事件類型。

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

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

Multitouch.inputMode=MultitouchInputMode.GESTURE; 
 
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(TransformGestureEvent.GESTURE_SWIPE, swipehandler); 
 
function swipehandler(evt:TransformGestureEvent): void { 
myTextField.text = "I've been swiped"; 
myTextField.y = 50; 
addChild(myTextField); 
}

兩根手指點選事件的處理方式相同,但是使用 GestureEvent 類別:

Multitouch.inputMode=MultitouchInputMode.GESTURE; 
 
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(GestureEvent.    GESTURE_TWO_FINGER_TAP, taphandler); 
 
function taphandler(evt:GestureEvent): void { 
myTextField.text = "I've been two-finger tapped"; 
myTextField.y = 50; 
addChild(myTextField); 
}

按下並輕點事件的處理方式也相同,但是使用 PressAndTapGestureEvent 類別:

Multitouch.inputMode=MultitouchInputMode.GESTURE; 
 
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(PressAndTapGestureEvent.        GESTURE_PRESS_AND_TAP, taphandler); 
 
function taphandler(evt:PressAndTapGestureEvent): void { 
myTextField.text = "I've been press-and-tapped"; 
myTextField.y = 50; 
addChild(myTextField); 
}
備註: 在所有執行階段環境中,並非支援所有 GestureEvent、TransformGestureEvent 和 PressAndTapGestureEvent 事件類型。例如,並非所有觸控裝置都可以偵測多根手指揮動。因此,無法偵測多根手指揮動的裝置就不支援 InteractiveObject gestureSwipe 事件。嘗試測試特定事件支援,以確保應用程式可以運作,並參閱疑難排解,以取得詳細資訊。

手勢事件屬性

手勢事件的事件屬性範圍小於基本觸控事件。而其存取方式一樣是透過事件處理常式函數中的事件物件。

例如,使用者在 mySprite 上執行旋轉手勢時,下列程式碼會將它旋轉。這個文字欄位會顯示最後一個手勢之後的旋轉量 (測試這個程式碼時,將它旋轉數次以查看值變更):

Multitouch.inputMode=MultitouchInputMode.GESTURE; 
 
var mySprite:Sprite = new Sprite(); 
var mySpriteCon:Sprite = new Sprite(); 
var myTextField:TextField = new TextField(); 
myTextField.y = 50; 
addChild(myTextField); 
 
mySprite.graphics.beginFill(0x336699); 
mySprite.graphics.drawRect(-20,-20,40,40); 
mySpriteCon.addChild(mySprite); 
mySprite.x = 20; 
mySprite.y = 20; 
addChild(mySpriteCon); 
 
mySprite.addEventListener(TransformGestureEvent.GESTURE_ROTATE, rothandler); 
 
function rothandler(evt:TransformGestureEvent): void { 
evt.target.parent.rotationZ += evt.target.rotation; 
myTextField.text = evt.target.parent.rotation.toString(); 
}
備註: 在所有執行階段環境中,並非支援所有 TransformGestureEvent 屬性。例如,並非所有觸控裝置都可以偵測螢幕上的手勢旋轉。因此,無法偵測手勢旋轉的裝置就不支援 TransformGestureEvent.rotation 屬性。嘗試測試特定屬性支援,以確保應用程式可以運作,並參閱疑難排解,以取得詳細資訊。

手勢階段

此外,還可以透過階段來追蹤手勢事件,因此您可以在執行手勢時追蹤屬性。例如,您可以追蹤在使用揮動手勢移動物件時的 x 座標。使用這些值,可以在揮動完成之後,透過路徑中的所有點來繪製線條。或是,在螢幕中使用平移手勢拖曳顯示物件時,以視覺方式變更該顯示物件。請在平移手勢完成之後再次變更物件。
Multitouch.inputMode = MultitouchInputMode.GESTURE; 
var mySprite = new Sprite(); 
mySprite.addEventListener(TransformGestureEvent.GESTURE_PAN , onPan); 
mySprite.graphics.beginFill(0x336699); 
mySprite.graphics.drawRect(0, 0, 40, 40); 
var myTextField = new TextField(); 
myTextField.y = 200; 
addChild(mySprite); 
addChild(myTextField); 
 
function onPan(evt:TransformGestureEvent):void { 
 
    evt.target.localX++; 
 
if (evt.phase==GesturePhase.BEGIN) { 
    myTextField.text = "Begin"; 
    evt.target.scaleX *= 1.5; 
    evt.target.scaleY *= 1.5; 
} 
if (evt.phase==GesturePhase.UPDATE) { 
    myTextField.text = "Update"; 
    evt.target.alpha = 0.5; 
} 
if (evt.phase==GesturePhase.END) { 
    myTextField.text = "End"; 
    evt.target.width = 40; 
    evt.target.height = 40; 
    evt.target.alpha = 1; 
} 
}
備註: 更新階段的頻率取決於執行階段的環境。部分的作業系統和硬體組合則根本不會轉送更新。

簡單手勢事件的手勢階段是「all」

部分的手勢事件物件不會追蹤手勢事件的個別階段,而是改為以 all 值填入事件物件的 phase 屬性。簡單手勢會揮動,而兩根手指點選則不會透過多個階段來追蹤事件。針對偵聽 gestureSwipegestureTwoFingerTap 事件,其 InteractiveObject 事件物件的 phase 屬性在傳送事件之後一律會是 all

Multitouch.inputMode = MultitouchInputMode.GESTURE; 
var mySprite = new Sprite(); 
mySprite.addEventListener(TransformGestureEvent.GESTURE_SWIPE, onSwipe); 
mySprite.addEventListener(GestureEvent.GESTURE_TWO_FINGER_TAP, onTwoTap); 
mySprite.graphics.beginFill(0x336699); 
mySprite.graphics.drawRect(0, 0, 40, 40); 
var myTextField = new TextField(); 
myTextField.y = 200; 
addChild(mySprite); 
addChild(myTextField); 
 
function onSwipe(swipeEvt:TransformGestureEvent):void { 
    myTextField.text = swipeEvt.phase // Output is "all" 
} 
function onTwoTap(tapEvt:GestureEvent):void { 
    myTextField.text = tapEvt.phase // Output is "all" 
}