Tratamento de Eventos de gestos

Flash Player 10.1 e posterior, Adobe AIR 2 e posterior

Manipule eventos de gesto da mesma forma que eventos de toque básicos. Você pode monitorar uma série de eventos de gesto definidos pelas constantes de tipo de evento na classe TransformGestureEvent , GestureEvent e na classe PressAndTapGestureEvent .

Para manipular um evento de toque de gesto:
  1. Configure o aplicativo para manipular entrada de gestos definindo a propriedade flash.ui.Multitouch.inputMode para MultitouchInputMode.GESTURE .

  2. Anexe um ouvinte de evento à uma instância de uma classe que herda propriedades da classe InteractiveObject como, por exemplo, Sprite ou TextField.

  3. Especifique o tipo de evento de gesto a ser manipulado.

  4. Chame a função do manipulador do evento para responder ao evento.

O exemplo a seguir exibe uma mensagem quando o quadrado desenhado em mySprite é tocado em uma tela sensível ao toque:

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); 
}

Eventos de toque de dois dedos são manipulados da mesma forma, mas utilizam a classe 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); 
}

Eventos de pressionar e tocar também são manipulados da mesma forma, mas utilizam a classe 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); 
}
Nota: Nem todos os tipos de evento GestureEvent, TransformGestureEvent e PressAndTapGestureEvent possuem suporte em todos os ambientes de tempo de execução. Por exemplo, nem todos os dispositivos sensíveis ao toque são capazes de detectar um toque com diversos dedos. Dessa forma, os eventos InteractiveObject gestureSwipe não possuem suporte nestes dispositivos. Tente testar o suporte de um evento específico para verificar se o aplicativo funciona e, em seguida, consulte Solução de problemas para obter mais informações.

Propriedades de Evento de gestos

Eventos de gesto possuem um escopo menor de propriedades de eventos do que eventos de toque básicos. Você pode acessá-los da mesma forma, por meio do objeto de vento na função do manipulador de eventos.

Por exemplo, o código a seguir gira a mySprite conforme o usuário executa um gesto de rotação nela. O campo de texto mostra o valor da rotação desde o último gesto (ao testar o código, gire-o diversas vezes para verificar a mudança do valor):

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(); 
}
Nota: Nem todas as propriedades TransformGestureEvent possuem suporte em todos os ambientes de tempo de execução. Por exemplo, nem todos os dispositivos sensíveis ao toque são capazes de detectar a rotação de um gesto na tela. Dessa forma, a propriedade TransformGestureEvent.rotation não possui suporte em todos estes dispositivos. Tente testar o suporte de uma propriedade específica para verificar se o aplicativo funciona e, em seguida, consulte Solução de problemas para obter mais informações.

Fases de gestos

Além disso, eventos de gesto podem ser monitorados por meio de fases, de forma que você possa acompanhar as propriedades conforme o gesto é executado. Por exemplo, é possível acompanhar as coordenadas x conforme um objeto é movido com um gesto deslizante. Utilize esses valores para desenhar uma linha por todos os pontos no caminho após o gesto deslizante ser concluído. De forma alternativa, altere visualmente um objeto de exibição conforme ele é arrastado pela tela utilizando um gesto de deslocamento. Altere o objeto novamente para concluir o gesto de deslocamento.
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; 
} 
}
Nota: A frequência da fase de atualização depende do ambiente do tempo de execução. Algumas combinações de hardware e sistema operacional não podem encaminhar nenhuma atualização.

A fase de gesto é “tudo” para eventos de gestos simples

Alguns objetos de evento de gestos não acompanham fases individuais do evento de gesto e, em vez disso, preenchem a propriedade de fase do objeto de evento com o valor "all". O gesto simples de giro e toque com dois dedos não acompanha o evento por fases múltiplas. A propriedade phase de um objeto de evento InteractiveObject ouvindo um evento gestureSwipe ou gestureTwoFingerTap é sempre all , após o evento ser despachado:

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