Obsługa zdarzeń gestów

Flash Player 10.1 i nowsze wersje, Adobe AIR 2 i nowsze wersje

Zdarzenia gestów obsługuje się tak samo, jak proste zdarzenia dotyku. Aplikacja może wykrywać szereg zdarzeń gestów zdefiniowanych jako stałe typów zdarzeń w klasach TransformGestureEvent , GestureEvent i PressAndTapGestureEvent .

Aby obsłużyć zdarzenia gestu:
  1. Skonfiguruj aplikację do obsługi gestów, przypisując właściwości flash.ui.Multitouch.inputMode wartość MultitouchInputMode.GESTURE .

  2. Dołącz detektor zdarzeń do instancji klasy, która dziedziczy właściwości z klasy InteractiveObject, takiej jak Sprite lub TextField.

  3. Określ typ zdarzenia gestu, które ma być obsługiwane.

  4. Wywołuj funkcję obsługi zdarzenia, która wykona oczekiwaną czynność w odpowiedzi na zdarzenie.

Poniższy przykład prezentuje wyświetlanie komunikatu w przypadku machnięcia nad kwadratem narysowanym na obiekcie mySprite na ekranie dotykowym:

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

Zdarzenia stuknięcia dwoma palcami obsługiwane są tak samo, ale przy użyciu klasy 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); 
}

Zdarzenia naciśnięcia i stuknięcia również obsługiwane są w ten sam sposób, ale przy użyciu klasy 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); 
}
Uwaga: Nie wszystkie typy zdarzeń GestureEvent, TransformGestureEvent i PressAndTapGestureEvent są obsługiwane we wszystkich środowiskach wykonawczych. Na przykład nie wszystkie urządzenia dotykowe obsługują i wykrywają machnięcie kilkoma palcami. Na takich urządzeniach zdarzenia gestureSwipe klasy InteractiveObject nie są obsługiwane. Aby mieć pewność, że aplikacja będzie działała prawidłowo, należy sprawdzić, czy odpowiednie zdarzenia są obsługiwane. Więcej informacji można znaleźć w sekcji Rozwiązywanie problemów .

Właściwości zdarzenia Gesture

Zdarzenia gestów mają mniejszy zestaw właściwości niż proste zdarzenia dotyku. Dostęp do tych właściwości uzyskuje się tak samo, poprzez obiekt zdarzenia w funkcji obsługi zdarzenia.

W poniższym kodzie obiekt mySprite jest obracany w miarę, jak użytkownik wykonuje nad nim gest obrotu. W polu tekstowym wyświetlany jest kąt obrotu od ostatniego gestu (podczas testowania tego kodu należy obrócić obiekt kilkakrotnie, aby zaobserwować zmianę wartości):

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(); 
}
Uwaga: Nie wszystkie właściwości klasy TransformGestureEvent są obsługiwane we wszystkich środowiskach wykonawczych. Na przykład nie wszystkie urządzenia dotykowe obsługują i wykrywają gest obrotu. Na takich urządzeniach właściwość TransformGestureEvent.rotation nie jest obsługiwana. Aby mieć pewność, że aplikacja będzie działała prawidłowo, należy sprawdzić, czy odpowiednie właściwości są obsługiwane. Więcej informacji można znaleźć w sekcji Rozwiązywanie problemów .

Fazy zdarzenia Gesture

Ponadto aplikacja może śledzić kolejne fazy zdarzenia gestu, monitorując wartości właściwości w trakcie wykonywania gestu przez użytkownika. Można na przykład śledzić współrzędną x obiektu przesuwanego przy użyciu gestu machnięcia. Na podstawie wartości właściwości można na przykład narysować linię przez wszystkie punkty na ścieżce ruchu po zakończeniu gestu. Możliwa jest także, na przykład, zmiana wyglądu obiektu przeciąganego po ekranie przy użyciu gestu panoramowania. Po zakończeniu gestu obiekt może wrócić do pierwotnego wyglądu.
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; 
} 
}
Uwaga: Częstotliwość fazy aktualizacji zależy od środowiska wykonawczego. W niektórych kombinacjach systemów operacyjnych i sprzętu aktualizacje w ogóle nie są przekazywane.

W przypadku gestów prostych jedyną fazą jest faza „all”.

Niektóre obiekty zdarzeń gestów nie są podzielone na fazy. W takich przypadkach właściwość phase obiektu zdarzenia zawsze ma wartość all. Do gestów, których zdarzenia nie są podzielone na fazy, należy machnięcie i stuknięcie dwoma palcami. Właściwość phase obiektu zdarzenia w przypadku obiektu InteractiveObject wykrywającego zdarzenia gestureSwipe lub gestureTwoFingerTap ma zawsze wartość all od momentu wywołania zdarzenia:

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