Suche…


Bemerkungen

Ereignisse sind Daten, die ein Programm erstellen, austauschen und darauf reagieren kann. Der asynchrone Ereignisfluss wird von der Flash-Engine als Reaktion auf externe Ereignisse, z. B. Mausbewegungen oder einen anderen angezeigten Frame, über die Anzeigeliste gesendet. Jeder andere Ereignisfluss und die gesamte Ereignisverarbeitung sind synchron. Wenn also ein Codeteil ein Ereignis generiert hat, werden alle darauf befindlichen Reaktionen verarbeitet, bevor die nächste Codezeile ausgeführt wird, auch wenn mehrere Listener eines Ereignisses vorhanden sind wäre gelaufen, bevor das nächste Ereignis verarbeitet werden konnte.

Bei der Flash-Programmierung gibt es mehrere wichtige Ereignisse. Event.ENTER_FRAME wird generiert, bevor Flash ein weiteres Bild zeichnet, es signalisiert der gesamten Anzeigeliste, sich auf das Event.ENTER_FRAME vorzubereiten, und kann als synchroner Zeitgeber verwendet werden. MouseEvent.CLICK und seine Geschwister können verwendet werden, um Maus-Eingaben vom Benutzer zu erhalten, und TouchEvent.TOUCH_TAP ist ein Analogon für Touchscreens. KeyboardEvent.KEY_DOWN und KEY_UP bieten die Möglichkeit, Benutzereingaben über die Tastatur zu empfangen. Die Verwendung in mobilen Abteilungen ist jedoch aufgrund von Geräten ohne physische Tastatur nahezu unmöglich. Schließlich wird Event.ADDED_TO_STAGE sobald ein Anzeigeobjekt Zugriff auf die Bühne erhält, und wird in die globale Anzeigeliste aufgenommen, die die Gesamtheit der Ereignisse empfängt, die die Anzeigeliste aufblasen können.

Die meisten Ereignisse in Flash sind komponentenspezifisch. Wenn Sie eine eigene Komponente entwerfen, für die Flash-Ereignisse verwendet werden, verwenden Sie eine flash.events.Event Klasse flash.events.Event und ihre statischen String Eigenschaften, um die Ereignisgruppe der Komponente zu erstellen.

Benutzerdefinierte Ereignisse mit Ereignisdaten

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

So senden Sie ein benutzerdefiniertes Ereignis:

var dataObject:Object = {name: "Example Data"};

dispatchEvent(new CustomEvent(CustomEvent.START, dataObject))

Auf benutzerdefinierte Ereignisse warten:

addEventListener(CustomEvent.STOP, stopHandler);

function stopHandler(event:CustomEvent):void
{
    var dataObject:* = event.data;
}

Ereignisbehandlung aus der Anzeigeliste

package {
import flash.events.EventDispatcher;

public class AbstractDispatcher extends EventDispatcher {

    public function AbstractDispatcher(target:IEventDispatcher = null) {
        super(target);
    }

}
}

So senden Sie ein Ereignis in einer Instanz:

var dispatcher:AbstractDispatcher = new AbstractDispatcher();
dispatcher.dispatchEvent(new Event(Event.CHANGE));

So überwachen Sie Ereignisse in einer Instanz:

var dispatcher:AbstractDispatcher = new AbstractDispatcher();
dispatcher.addEventListener(Event.CHANGE, changeHandler);

function changeHandler(event:Event):void
{
}

Grundlegende Ereignisbehandlung

Flash sendet Events für die meisten Objekte. Eines der grundlegendsten Ereignisse ist ENTER_FRAME , das (bei der Framerate der SWF- ENTER_FRAME ) für jedes Anzeigelistenobjekt ENTER_FRAME wird.

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

Diese Funktion wird in jedem Frame asynchron aufgerufen. Dies bedeutet, dass die Funktion, die Sie als onEnterFrame Ereignishandler zuweisen, vor jedem anderen ActionScript-Code verarbeitet wird, der an die betroffenen Bilder angehängt wird.

Fügen Sie Ihre eigenen Ereignisse hinzu

Sie können Ihre eigenen Ereignisse erstellen und versenden, indem Sie die Event .

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

Sie können es dann mit einem EventDispatcher versenden und abhören. Beachten Sie, dass die meisten Flash-Objekte Ereignisverteiler sind.

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!"));

Beachten Sie, dass die clone erforderlich ist, wenn Sie Ihr Ereignis erneut versenden möchten.

Einfache Mausereignisstruktur

Durch die Verwendung von event types Sie die Codeaufblähung, die häufig beim Definieren von Ereignissen für viele Objekte auf der Bühne auftritt, auf einfache Weise reduzieren, indem Sie Ereignisse in einer Funktion filtern.

Stellen Sie sich vor, wir haben auf der Bühne 10 Objekte namens object1 , object2 ... object10

Sie könnten folgendes tun:

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

Vorteile dieser Methode sind:

  1. Sie müssen nicht die Anzahl der Objekte angeben, auf die Ereignisse angewendet werden sollen.
  2. Sie müssen nicht genau wissen, mit welchem ​​Objekt interagiert wurde, und dennoch die Funktionalität anwenden.
  3. Ereignisse einfach in großen Mengen anwenden.


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow