ActionScript 3
Mit Ereignissen arbeiten
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:
- Sie müssen nicht die Anzahl der Objekte angeben, auf die Ereignisse angewendet werden sollen.
- Sie müssen nicht genau wissen, mit welchem Objekt interagiert wurde, und dennoch die Funktionalität anwenden.
- Ereignisse einfach in großen Mengen anwenden.