Gesture 事件处理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 事件。尝试测试是否支持特定事件以确保您的应用程序能够正常工作,有关详细信息,请参阅疑难解答。
Gesture 事件属性动作事件的事件属性范围比基本触摸事件小。您可以通过事件处理函数中的事件对象以相同的方式访问这些属性。 例如,以下代码在用户对 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 属性。尝试测试是否支持特定属性以确保您的应用程序能够正常工作,有关详细信息,请参阅疑难解答。
Gesture 阶段另外,可以跟踪阶段中的动作事件,因此您可以在发生动作时跟踪相应的属性。例如,您可以在使用滑动动作移动对象时跟踪 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" } |
|