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:
-
Configureer uw toepassing voor het afhandelen van aanraakgebeurtenissen door de eigenschap
flash.ui.Multitouch.inputMode
in te stellen op
MultitouchInputMode.TOUCH_POINT
.
-
Koppel een gebeurtenislistener aan een klasseninstantie die de eigenschappen van de InteractiveObject-klasse overneemt, zoals bijvoorbeeld Sprite of TextField.
-
Geef aan welk type aanraakgebeurtenis moet worden afgehandeld.
-
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;
}
|
|
|
|
|