ActionScript 3
Werken met evenementen
Zoeken…
Opmerkingen
Evenementen zijn stukjes gegevens die een programma kan maken, uitwisselen en waarop kan worden gereageerd. De asynchrone gebeurtenisstroom wordt via de Flash-engine over de weergavelijst verzonden als reactie op externe gebeurtenissen, zoals muisbewegingen of een ander weergegeven frame. Elke andere gebeurtenisstroom en alle gebeurtenisverwerking is synchroon, dus als een stuk code een gebeurtenis heeft gegenereerd, worden alle reacties erop verwerkt voordat de volgende regel code wordt uitgevoerd, ook als er meerdere luisteraars van een gebeurtenis zijn, allemaal zou zijn uitgevoerd voordat de volgende gebeurtenis kon worden verwerkt.
Er zijn verschillende belangrijke gebeurtenissen geassocieerd met Flash-programmering. Event.ENTER_FRAME
wordt gegenereerd voordat Flash een ander frame tekent, het signaleert de hele weergavelijst ter voorbereiding op het tekenen en kan worden gebruikt als een synchrone timer. MouseEvent.CLICK
en zijn broers en zussen kunnen worden gebruikt om TouchEvent.TOUCH_TAP
van de gebruiker te ontvangen en TouchEvent.TOUCH_TAP
is een analoog voor aanraakschermen. KeyboardEvent.KEY_DOWN
en KEY_UP
bieden middelen om gebruikersinvoer van het toetsenbord te ontvangen, maar het gebruik ervan op de mobiele afdeling is bijna onmogelijk vanwege apparaten zonder fysiek toetsenbord. Ten slotte wordt Event.ADDED_TO_STAGE
verzonden zodra een weergaveobject toegang heeft tot het podium en opgenomen in de globale weergavelijst die alle gebeurtenissen ontvangt die op en neer kunnen worden weergegeven in de weergavelijst.
De meeste gebeurtenissen in Flash zijn componentspecifiek. Als u uw eigen component ontwerpt die Flash-gebeurtenissen gebruikt, gebruikt u een afstammingsklasse flash.events.Event
en de statische String
om de gebeurtenissenset van uw component te maken.
Aangepaste gebeurtenissen met gebeurtenisgegevens
package
{
import flash.events.Event;
public class CustomEvent extends Event
{
public static const START:String = "START";
public static const STOP:String = "STOP";
public var data:*;
public function CustomEvent(type:String, data:*,
bubbles:Boolean=false, cancelable:Boolean=false)
{
super(type, bubbles, cancelable);
if (data)
this.data = data;
}
}
}
Een aangepaste gebeurtenis verzenden:
var dataObject:Object = {name: "Example Data"};
dispatchEvent(new CustomEvent(CustomEvent.START, dataObject))
Om te luisteren naar aangepaste evenementen:
addEventListener(CustomEvent.STOP, stopHandler);
function stopHandler(event:CustomEvent):void
{
var dataObject:* = event.data;
}
Gebeurtenisafhandeling uit de displaylijst
package {
import flash.events.EventDispatcher;
public class AbstractDispatcher extends EventDispatcher {
public function AbstractDispatcher(target:IEventDispatcher = null) {
super(target);
}
}
}
Een evenement verzenden voor een exemplaar:
var dispatcher:AbstractDispatcher = new AbstractDispatcher();
dispatcher.dispatchEvent(new Event(Event.CHANGE));
Om te luisteren naar gebeurtenissen in een instantie:
var dispatcher:AbstractDispatcher = new AbstractDispatcher();
dispatcher.addEventListener(Event.CHANGE, changeHandler);
function changeHandler(event:Event):void
{
}
Basisafhandeling van evenementen
Flash verzendt Events
voor de meeste objecten. Een van de meest elementaire gebeurtenis is ENTER_FRAME
, die wordt verzonden (bij de framerate van de SWF) op elk weergave-lijstobject.
import flash.display.Sprite;
import flash.events.Event;
var s:Sprite = new Sprite();
s.addEventListener(Event.ENTER_FRAME, onEnterFrame);
function onEnterFrame(e:Event)
{
trace("I am called on every frame !");
}
Deze functie wordt asynchroon op elk frame genoemd. Dit betekent dat de functie die u toewijst als de gebeurtenishandler onEnterFrame
wordt verwerkt vóór elke andere ActionScript-code die is gekoppeld aan de betreffende frames.
Voeg je eigen evenementen toe
Je kunt je eigen evenementen maken en deze verzenden door de klasse Event
breiden.
import flash.events.Event;
class MyEvent extends Event
{
var data: String;
static public var MY_EVENT_TYPE = "my_event_my_event_code";
public function MyEvent(type: String, data: String)
{
this.data = data;
}
override public function clone():Event
{
return new MyEvent(type, data);
}
}
U kunt het vervolgens verzenden en beluisteren met behulp van een EventDispatcher
. Merk op dat de meeste flash-objecten event-dispatchers zijn.
import flash.events.EventDispatcher;
var d = new EventDispatcher();
d.addEventListener(MyEvent.MY_EVENT_TYPE, onType);
function onType(e: MyEvent)
{
trace("I have a string: "+e.data);
}
d.dispatchEvent(new MyEvent(MyEvent.MY_EVENT_TYPE, "Hello events!"));
Houd er rekening mee dat de clone
vereist is als u uw evenement opnieuw wilt verzenden.
Eenvoudige muisgebeurtenisstructuur
Door het gebruik van event types
kunt u gemakkelijk code-bloat verminderen die vaak voorkomt bij het definiëren van gebeurtenissen voor veel objecten op het podium door gebeurtenissen in 1 functie te filteren in plaats van het definiëren van vele functies voor gebeurtenisafhandeling.
Stel je voor dat we 10 objecten op het podium hebben met de naam object1
, object2
... object10
Je zou het volgende kunnen doen:
var i: int = 1;
while(getChildByName("object"+i) != null){
var obj = getChildByName("object"+i)
obj.addEventListener(MouseEvent.CLICK, ObjectMouseEventHandler);
obj.addEventListener(MouseEvent.MOUSE_OVER, ObjectMouseEventHandler);
obj.addEventListener(MouseEvent.MOUSE_OUT, ObjectMouseEventHandler);
obj.alpha = 0.75;
i++;
}
function ObjectMouseEventHandler(evt:Event)
{
if(evt.type == "click")
{
trace(evt.currentTarget + " has been clicked");
}
else
{
evt.currentTarget.alpha = evt.type == "mouseOver" ? 1 : 0.75;
}
}
Voordelen van deze methode zijn onder meer:
- U hoeft niet het aantal objecten op te geven waarop gebeurtenissen moeten worden toegepast.
- Niet nodig om specifiek te weten met welk object interactie was, maar toch functionaliteit toepassen.
- Eenvoudig evenementen in bulk toepassen.