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:

  1. U hoeft niet het aantal objecten op te geven waarop gebeurtenissen moeten worden toegepast.
  2. Niet nodig om specifiek te weten met welk object interactie was, maar toch functionaliteit toepassen.
  3. Eenvoudig evenementen in bulk toepassen.


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow