Aanraakgebeurtenissen afhandelen

Flash Player 10.1 of hoger, Adobe AIR 2 of hoger

Basisaanraakgebeurtenissen worden in ActionScript op dezelfde manier afgehandeld als andere gebeurtenissen, zoals muisgebeurtenissen. U kunt luisteren naar een reeks aanraakgebeurtenissen die zijn gedefinieerd door de constanten voor gebeurtenistypen in de TouchEvent-klasse .
Opmerking: Bij multitouch-puntinvoer (wanneer u bijvoorbeeld een aparaat met meer vingers aanraakt), worden bij de eerste aanraking een muisgebeurtenis en een aanraakgebeurtenis verzonden.
Als u een basisaanraakgebeurtenis wilt afhandelen, gaat u als volgt te werk:
  1. Configureer uw toepassing voor het afhandelen van aanraakgebeurtenissen door de eigenschap flash.ui.Multitouch.inputMode in te stellen op MultitouchInputMode.TOUCH_POINT .

  2. Koppel een gebeurtenislistener aan een klasseninstantie die de eigenschappen van de InteractiveObject-klasse overneemt, zoals bijvoorbeeld Sprite of TextField.

  3. Geef aan welk type aanraakgebeurtenis moet worden afgehandeld.

  4. Roep een gebeurtenisafhandelingsfunctie aan om te reageren op de gebeurtenis.

Met de volgende code wordt een bericht weergegeven als het vierkant op mySprite wordt aangeraakt op een aanraakscherm.

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

Eigenschappen van aanraakgebeurtenissen

Wanneer een gebeurtenis optreedt, wordt een gebeurtenisobject gemaakt. Het TouchEvent-object bevat informatie over de locatie en voorwaarden van de aanraakgebeurtenis. Met de eigenschappen van het gebeurtenisobject kunt u deze informatie ophalen.

Met de volgende code wordt het TouchEvent-object evt gemaakt, waarna de eigenschap stageX van het gebeurtenisobject in het tekstveld wordt weergegeven (de x-coördinaat van het punt in het werkgebied waar de aanraking plaatsvond):

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); 
}
Zie de TouchEvent -klasse voor de eigenschappen die beschikbaar zijn via het gebeurtenisobject.
Opmerking: Niet alle TouchEvent-eigenschappen worden in alle runtimeomgevingen ondersteund. Zo kan niet bij alle aanraakapparaten worden bepaald hoeveel druk door de gebruiker op het aanraakscherm wordt toegepast. Op deze apparaten wordt de eigenschap TouchEvent.pressure dan ook niet ondersteund. Test of specifieke eigenschappen worden ondersteund. Zo weet u zeker dat uw toepassing werkt. Ga naar Problemen oplossen voor meer informatie.

Fasen voor aanraakgebeurtenissen

Zorg ervoor dat aanraakgebeurtenissen in verschillende fasen worden bijgehouden, ook buiten een InteractiveObject, net als bij muisgebeurtenissen. Zorg er ook voor dat aanraakgebeurtenissen aan het begin, midden en einde van een aanraakinteractie wordt bijgehouden. De TouchEvent-klasse biedt waarden voor het afhandelen van de gebeurtenissen touchBegin , touchMove en touchEnd .

Zo kunt u met de gebeurtenissen touchBegin , touchMove en touchEnd visuele feedback geven aan de gebruiker wanneer hij een weergaveobject aanraakt en verplaatst:

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; 
}
Opmerking: De initiële aanraaklistener wordt gekoppeld aan mySprite, maar dit geldt niet voor de listeners voor het verplaatsen en beëindigen van de aanraakgebeurtenis. Als de vinger of het aanraakapparaat van de gebruiker zich vooruitbeweegt vóór het weergaveobject, blijft het werkgebied luisteren naar de aanraakgebeurtenis.

Aanraakpunt-id

De eigenschap TouchEvent.touchPointID is een essentieel element bij het schrijven van toepassingen die reageren op aanraakinvoer. De Flash-runtime wijst een unieke touchPointID -waarde toe aan elk aanraakpunt. Wanneer een toepassing reageert op de fasen of verplaatsing van een aanraakinvoer, moet u de touchPointID controleren voordat de gebeurtenis wordt afgehandeld. De sleepmethoden voor aanraakinvoer van de Sprite-klasse gebruiken de eigenschap touchPointID als parameter, zodat de juiste invoerinstantie wordt afgehandeld. De eigenschap touchPointID zorgt ervoor dat een gebeurtenishandler reageert op het juiste aanraakpunt. Als dit niet het geval was, zou de gebeurtenishandler reageren op elke instantie van het aanraakgebeurtenistype op het apparaat (zoals alle touchMove -gebeurtenissen), wat zou leiden tot onvoorspelbaar gedrag. De eigenschap is vooral belangrijk wanneer de gebruiker objecten sleept.

Met de eigenschap touchPointID kunt u een gehele aanraakreeks beheren. Een aanraakreeks heeft één touchBegin -gebeurtenis, nul of meer touchMove -gebeurtenissen en één touchEnd -gebeurtenis, alle met dezelfde touchPointID -waarde.

In het volgende voorbeeld wordt een variabele touchMoveID vastgelegd om op de juiste touchPointID -waarde te testen voordat op een aanraakgebeurtenis wordt gereageerd. Anders wordt de gebeurtenishandler ook door andere aanraakinvoer geactiveerd. Zoals u ziet, bevinden de listeners voor de bewegings- en eindfase zich in het werkgebied, niet in het weergaveobject. Het werkgebied luistert naar de verplaatsings- of eindfase voor het geval dat de aanraking van de gebruiker verder gaat dan de grenzen van het weergaveobject.
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; 
}