Hantering av pekhändelser

Flash Player 10.1 och senare, Adobe AIR 2 och senare

Enkla pekhändelser hanteras på samma sätt som andra händelser, till exempel mushändelser, i ActionScript. Du kan lyssna efter en serie pekhändelser som definieras av händelsetypens konstanter i klassen TouchEvent.
Obs! När det gäller indata med flera kontaktpunkter (till exempel när du rör en enhet med mer än ett finger) kommer den första beröringen att skicka en mushändelse och en pekhändelse.
Så här hanterar du en enkel pekhändelse:
  1. Ange att programmet ska hantera pekhändelser genom att ange egenskapen flash.ui.Multitouch.inputMode till MultitouchInputMode.TOUCH_POINT.

  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 pekhä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 vidrör den fyrkant som ritats på mySprite på en pekskärm:

Multitouch.inputMode=MultitouchInputMode.TOUCH_POINT; 
 
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(TouchEvent.TOUCH_TAP, taphandler); 
 
function taphandler(evt:TouchEvent): void { 
    myTextField.text = "I've been tapped"; 
    myTextField.y = 50; 
    addChild(myTextField); 
}

Egenskaper för pekhändelser

När ett fel inträffar skapas ett händelseobjekt. Objektet TouchEvent innehåller information om platsen och villkoren för en pekhändelse. Du kan använda egenskaperna för händelseobjektet för att hämta den informationen.

I följande kod skapas till exempel TouchEvent-objektet evt, och sedan visas egenskapen stageX för händelseobjektet (x-koordinaten för den punkt i Stage-området där pekningen inträffade) i textfältet:

Multitouch.inputMode=MultitouchInputMode.TOUCH_POINT; 
 
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(TouchEvent.TOUCH_TAP, taphandler); 
 
function taphandler(evt:TouchEvent): void { 
myTextField.text = evt.stageX.toString; 
myTextField.y = 50; 
addChild(myTextField); 
}
Se klassen TouchEvent för tillgängliga egenskaper genom händelseobjektet.
Obs! Alla TouchEvent-egenskaper stöds inte i alla körningsmiljöer. Alla enheter med pekskärm kan till exempel inte identifiera hur hårt eller löst som användaren trycker på pekskärmen. Egenskapen TouchEvent.pressure 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 pekhändelser

Spåra pekhändelser i olika nivåer över och utanför ett InteractiveObject på samma sätt som för mushändelser. Spåra också pekhändelser genom de olika faserna från början till mitten och slutet av en pekhändelse. Klassen TouchEvent ger värden för hantering av händelserna touchBegin, touchMove och touchEnd.

Du kan till exempel använda händelserna touchBegin, touchMove och touchEnd för att ge användarna visuell återkoppling när de pekar och flyttar på ett visningsobjekt:

Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT; 
var mySprite:Sprite = new Sprite(); 
mySprite.graphics.beginFill(0x336699); 
mySprite.graphics.drawRect(0,0,40,40); 
addChild(mySprite); 
var myTextField:TextField = new TextField(); 
myTextField.width = 200; 
myTextField.height = 20; 
addChild(myTextField); 
 
mySprite.addEventListener(TouchEvent.TOUCH_BEGIN, onTouchBegin); 
stage.addEventListener(TouchEvent.TOUCH_MOVE, onTouchMove); 
stage.addEventListener(TouchEvent.TOUCH_END, onTouchEnd); 
function onTouchBegin(event:TouchEvent) { 
    myTextField.text = "touch begin" + event.touchPointID; 
} 
function onTouchMove(event:TouchEvent) { 
    myTextField.text = "touch move" + event.touchPointID; 
} 
function onTouchEnd(event:TouchEvent) { 
    myTextField.text = "touch end" + event.touchPointID; 
}
Obs! Den initiala pekavlyssnaren finns bifogad till mySprite, men avlyssnarna för att flytta objektet och för slutet av pekhändelsen är inte bifogade. Om användarens finger eller pekdon flyttar framför visningsobjektet fortsätter scenen att lyssna efter pekhändelsen.

Kontaktpunkts-ID

Egenskapen TouchEvent.touchPointID är en viktig del för att skriva program som svarar på pekrörelser. Flash-körningen tilldelar varje kontaktpunkt ett unikt touchPointID-värde. Kontrollera touchPointID innan händelsen hanteras när ett program svarar på faser eller rörelser från en pekhändelse. Indatametoderna för peka och dra i klassen Sprite använder egenskapen touchPointID som en parameter så att rätt indatainstans hanteras. Egenskapen touchPointID ser till att en händelsehanterare svarar på rätt kontaktpunkt. Annars svarar händelsehanteraren på alla instanser av pekhändelsetypen (till exempel alla touchMove-händelser) på enheten och skapar ett oförutsägbart beteende. Egenskapen är särskilt viktig när användaren drar och flyttar objekt.

Använd egenskapen touchPointID om du vill hantera en hel peksekvens. En peksekvens består av en touchBegin-händelse, en (eller inga) eller flera touchMove-händelser och en touchEnd-händelse, och alla har samma touchPointID-värde.

I följande exempel etableras ett variabelt touchMoveID som ett test för det korrekta touchPointID-värdet innan programmet svarar på en pekhändelse för att flytta ett objekt. Annars utlöses händelsehanteraren även av andra pekrörelser. Observera att avlyssnarna för flytt- och slutfaserna ligger på scenen och inte på visningsobjektet. Scenen lyssnar efter flytt- eller slutfaserna om användaren skulle flytta utanför visningsobjektets gränser.
Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT; 
var mySprite:Sprite = new Sprite(); 
mySprite.graphics.beginFill(0x336699); 
mySprite.graphics.drawRect(0,0,40,40); 
addChild(mySprite); 
var myTextField:TextField = new TextField(); 
addChild(myTextField); 
myTextField.width = 200; 
myTextField.height = 20; 
var touchMoveID:int = 0; 
 
mySprite.addEventListener(TouchEvent.TOUCH_BEGIN, onTouchBegin); 
function onTouchBegin(event:TouchEvent) { 
    if(touchMoveID != 0) { 
        myTextField.text = "already moving. ignoring new touch";     
        return; 
    } 
    touchMoveID = event.touchPointID; 
 
    myTextField.text = "touch begin" + event.touchPointID; 
    stage.addEventListener(TouchEvent.TOUCH_MOVE, onTouchMove); 
    stage.addEventListener(TouchEvent.TOUCH_END, onTouchEnd); 
} 
function onTouchMove(event:TouchEvent) { 
    if(event.touchPointID != touchMoveID) { 
        myTextField.text = "ignoring unrelated touch"; 
        return; 
    } 
    mySprite.x = event.stageX; 
    mySprite.y = event.stageY; 
    myTextField.text = "touch move" + event.touchPointID; 
} 
function onTouchEnd(event:TouchEvent) { 
    if(event.touchPointID != touchMoveID) { 
        myTextField.text = "ignoring unrelated touch end"; 
        return; 
    } 
    touchMoveID = 0; 
    stage.removeEventListener(TouchEvent.TOUCH_MOVE, onTouchMove); 
    stage.removeEventListener(TouchEvent.TOUCH_END, onTouchEnd); 
    myTextField.text = "touch end" + event.touchPointID; 
}