手勢事件處理Flash Player 10.1 以及更新的版本,Adobe AIR 2 以及更新的版本 使用與基本觸控事件相同的方式,處理手勢事件。您可以偵聽 TransformGestureEvent 類別、GestureEvent 類別和 PressAndTapGestureEvent 類別中事件類型常數所定義的一連串手勢事件。 若要處理手勢觸控事件:
例如,下列程式碼會在揮動觸控螢幕內 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 屬性。簡單手勢會揮動,而兩根手指點選則不會透過多個階段來追蹤事件。針對偵聽 gestureSwipe 或 gestureTwoFingerTap 事件,其 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" } |
|