Gesture 事件处理

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 事件。尝试测试是否支持特定事件以确保您的应用程序能够正常工作,有关详细信息,请参阅 疑难解答

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