Обработка событий жеста

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 могут не поддерживаться во всех средах. Например, не все устройства с сенсорным экраном поддерживают обнаружение перемещения нескольких пальцев. Поэтому события gestureSwipe объекта InteractiveObject не поддерживаются в этих устройствах. Попробуйте проверить наличие поддержки определенного события для обеспечения правильной работы приложения и см. раздел « Устранение неполадок » для получения дополнительных сведений.

Свойства событий жеста

События жестов имеют меньший диапазон свойств событий, чем основные события прикосновения. Доступ к ним осуществляется так же: через объект события в функции обработчика события.

Например, в следующем коде выполняется поворот объекта 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 не поддерживается в этих устройствах. Попробуйте проверить наличие поддержки определенного свойства для обеспечения правильной работы приложения и см. раздел « Устранение неполадок » для получения дополнительных сведений.

Фазы жеста

Кроме того, события жестов можно отслеживать с помощью фаз, поэтому можно отслеживать свойства при выполнении жеста. Например, можно отслеживать координаты Х, когда объект перемещается жестом перемещения. Используйте эти значения для рисования линии, проходящей через все точки на пути перемещения, по завершении выполнения жеста перемещения. Или визуально измените экранный объект при его перетаскивании по экрану с помощью жеста панорамирования. Снова измените экранный объект по завершении выполнения жеста панорамирования.
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 в свойстве фазы объекта события. При простых жестах перемещения пальцев или прикосновения двумя пальцами событие не отслеживается по нескольким фазам. Свойство phase объекта события для прослушивания объектом InteractiveObject listening событий gestureSwipe или gestureTwoFingerTap всегда имеет значение 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" 
}