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