Hantering av gesthändelser

Flash Player 10.1 och senare, Adobe AIR 2 och senare

Gesthändelser hanteras på samma sätt som enkla pekhändelser. Du kan lyssna efter en serie gesthändelser som definieras av konstanterna för händelsetypen i klassen TransformGestureEvent , GestureEvent och PressAndTapGestureEvent .

Så här hanterar du en pekhändelse med gester:
  1. Ange att programmet ska hantera gester genom att ange egenskapen flash.ui.Multitouch.inputMode till MultitouchInputMode.GESTURE .

  2. Bifoga en händelseavlyssnare till en instans av en klass som ärver egenskaperna från klassen InteractiveObject, till exempel Sprite eller TextField.

  3. Ange vilken typ av gesthändelse som ska hanteras.

  4. Anropa en händelsehanterare som ska göra något som svar på händelsen.

I följande exempel visas till exempel ett meddelande när någon sveper vid den fyrkant som ritats på mySprite på en pekskärm:

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

Pekhändelser som baseras på två fingrar hanteras på samma sätt, men använder klassen 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); 
}

Tryck-och-peka-händelser hanteras också på samma sätt, men använder klassen 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); 
}
Obs! Alla GestureEvent-, TransformGestureEvent- och PressAndTapGestureEvent-hänselsetyper stöds inte i alla körningsmiljöer. Alla enheter med pekskärm kan till exempel inte identifiera svepningar med flera fingrar. Händelserna gestureSwipe för InteractiveObject stöds därför inte på dessa enheter. Testa om olika händelser stöds så att du kan vara säker på att programmet fungerar som det ska. Se Felsökning för mer information.

Egenskaper för gesthändelser

Gesthändelser har färre händelseegenskaper än enkla pekhändelser. Du får tillgång till dem på samma sätt, via händelseobjektet för händelsehanteraren.

I följande kod roteras till exempel mySprite när användaren utför en rotationsgest på den. I textfältet visas den grad av rotation som använts sedan den senaste gesten (vid testning av koden ser du till att rotera den flera gånger för att se om värdena ändras):

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(); 
}
Obs! Alla TransformGestureEvent-egenskaper stöds inte i alla körningsmiljöer. Alla enheter med pekskärm kan till exempel inte identifiera en gestrotation på skärmen. Egenskapen TransformGestureEvent.rotation stöds därför inte på dessa enheter. Testa om olika egenskaper stöds så att du kan vara säker på att programmet fungerar som det ska. Se Felsökning för mer information.

Faser för gesthändelser

Gesthändelser kan dessutom spåras genom olika faser så att du kan spåra egenskaper samtidigt som geströrelsen utförs. Du kan till exempel spåra x-koordinater samtidigt som ett objekt flyttas med en svepningsgest. Använd dessa värden om du vill rita en linje genom alla punkter i banan efter att svepningen har slutförts. Eller ändra ett visningsobjekt visuellt samtidigt som det dras över skärmen med en panoreringsgest. Ändra objektet igen när panoreringsgesten har slutförts.
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; 
} 
}
Obs! Intervallet för uppdateringsfasen beror på körningsmiljön. I vissa kombinationer av operativsystem och maskinvara skickas inte några uppdateringar ut alls.

Gestfasen är ”alla” för enkla gesthändelser

Vissa objekt för gesthändelser spårar inte enskilda faser av gesthändelsen, utan istället anges värdet ”alla” för händelseobjektets fasegenskap. För de enkla gesterna svepning och tvåfingerpek spåras inte händelsen genom flera faser. Egenskapen phase för händelseobjektet för ett InteractiveObject som lyssnar efter gestureSwipe - eller gestureTwoFingerTap -händelser är alltid all när händelsen väl har skickats:

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