13.07.09 // 09:36 Uhr

AS3 – Eigene Events verwenden

as3

Events sind ein nützliches Werkzeug in ActionScript3 um Programmabläufe erst zu einem bestimmten Zeitpunkt auszuführen. Ein einfaches Beispiel: Der Benutzer klickt auf einen Button und ein Link wird geöffnet. Für diesen und viele andere Fälle hat Flash voreingestellte Events. Irgendwann, gerade wenn man eigene Klassen oder sogar ein eigenes Framework entwickelt, kommt man aber an den Punkt wo man denkt „Hmm, dafür wär jetzt ein eigenes Event echt praktisch”. Das ist zum Glück kein Problem - wenn man weiß wie´s geht:

Download der Beispieldateien

trennlinie

Zuerst die Basics: Wie werden Events verwendet?

Ein voreingestelltes Event zu nutzen ist ganz einfach. Bleiben wir bei dem Beispiel mit dem Button: Sobald der Nutzer auf die Schaltfläche „openLink_btn" klickt, soll etwas passieren. Das ganze funktioniert so:

1
2
3
4
5
6
7
8
// EventListener
openLink_btn.addEventListener(MouseEvent.CLICK, machWas);
 
// Eventfunktion
function machWas() {
    // Rufe eine URL auf
    navigateToURL(new URLRequest("http://www.thomas-aull.de", "_self"));
}

Wir sagen einem EventListener, dass er die ganze Zeit auf den Button „openLink_btn” horchen soll, ob der Nutzer mit der Maus draufklickt. Tritt dieser Fall ein, soll er die Funktion „machWas” aufrufen.

trennlinie

Jetzt geht´s ans Eingemachte: eigene Events schreiben...

...was schon ein wenig schwieriger ist. Ein wenig Grundwissen in Objektorientierter Programmierung kann nicht schaden um den kompletten Vorgang zu verstehen.

Zuerst erzeugen wir unsere eigene Eventklasse, die die Flash-Eventklasse erweitert. Grob gesagt: Wir nehmen die Eventklasse von Flash und packen unseren Code einfach dazu. Dieser Code muss in einer eigenen .as-Datei mit dem Namen „MeinEvent.as" abgelegt werden:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package {
        // Import der Flash Eventklasse
	import flash.events.*;
 
	public class MeinEvent extends Event {
 
                // Eventarten, bekanntes Beispiel: MouseEvent.CLICK
		public static const TESTEREIGNIS:String = "TESTEREIGNIS";
 
                // Variable in denen wir zusätzliche Eventdaten speichern können
		public var data;
 
                // Der Konstruktor
		public function MeinEvent(type:String, data) {
			super(type);
			this.data = data;
		};
	};
};

Als nächstes erzeugen wir eine neue Flash-Datei (AS3) und packen folgenden Code in das erste Schlüsselbild:

1
2
3
4
5
6
7
8
9
10
11
12
13
// Wir sagen Flash, dass wir unsere Klasse "MeinEvent" benutzen wollen
import MeinEvent;
 
// Wir fügen einen EventListener wie im Beispiel oben hinzu
addEventListener(MeinEvent.TESTEREIGNIS, machWas)
 
// Hier feuern wir unser Event ab
dispatchEvent(new MeinEvent(MeinEvent.TESTEREIGNIS, null));
 
// Die Funktion die dann durch den EventListener aufgerufen wird
function machWas(e:MeinEvent) {
    trace("Das Event funktioniert!");
};

Zuerst sagen wir Flash, dass wir unsere Klasse "meinEvent" verwenden wollen. Anschließend schreiben wir einen normalen EventListener wie im MouseEvent-Beispiel oben. Wir sagen hier aber, dass er auf das Event „MeinEvent” und den Eventtyp „TESTEREIGNIS” hören soll. Tritt dieser Fall ein, soll er die Funktion „machWas” aufrufen.

Weil jetzt aber niemand außer uns weiß, wann das Event genau aufgerufen werden soll, müssen wir das selbst machen. Das ist der sogenannte „Event-Dispatcher”. Der sagt, dass bitteschön jetzt unser Event „MeinEvent” mit dem Eventtyp „TESTEREIGNIS” abgefeuert werden soll. Wir wollen keine weiteren Eventdaten übergeben (= null).

Wenn wir den Film jetzt starten, bekommen wir einen trace mit dem Inhalt "Das Event funktioniert!". Wichtig dabei ist, dass alle Dateien im gleichen Verzeichnis liegen!

Und jetzt?

Das war die eigentliche Grundlogik. Wir können unsere Events aber noch um folgende Punkte ergänzen:

Mehrere Eventtypen verwenden: Um weitere Eventtypen verwenden zu können, müssen wir einfach unsere Eventklasse um die entsprechenden Variablen erweitern. Wenn wir anstatt des Eventtyps „TESTEREIGNIS” auch noch „USERINTERKATION” und „BILD_GELADEN” abfragen möchten, hinterlegen wir diese einfach in unserer Klasse:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package {
        // Import der Flash Eventklasse
	import flash.events.*;
 
	public class MeinEvent extends Event {
 
                // Eventarten, bekanntes Beispiel: MouseEvent.CLICK
		public static const TESTEREIGNIS:String = "TESTEREIGNIS";
                public static const USERINTERAKTION:String = "USERINTERAKTION";
                public static const BILD_GELADEN:String = "BILD_GELADEN";
 
                // Variable in denen wir zusätzliche Eventdaten speichern können
		public var data;
 
                // Der Konstruktor
		public function MeinEvent(type:String, data) {
			super(type);
			this.data = data;
		};
	};
};

Eventdaten übergeben: Häufig ist es auch erforderlich an das Event verschiedene Daten anzuhängen die für die Weiterverarbeitung nötig sind. In unsere Eventklasse haben wir dafür schon die nötige Variable „data” hinterlegt. Wir müssen im Dispatcher einfach noch die Daten übergeben. In unserer Eventfunktion können wir diese Daten dann auslesen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
// EventListener
addEventListener(MeinEvent.TESTEREIGNIS, machWas)
 
// Dispatcher mit Eventdaten füttern...
var data:Object = new Object;
data.name = "Max Mustermann";
data.alter = 21;
// ...und abfeuern
dispatchEvent(new MeinEvent(MeinEvent.TESTEREIGNIS, data));
 
// Eventfunktion: Daten auslesen
function machWas(e:MeinEvent) {
    trace(e.data.name);
    trace(e.data.alter);
};

Download der Beispieldateien

 
 

Kommentare ( 7 )

  1. 13.07.09 // 21:27 Uhr

    AS3 eigene Events - Schnipsel - Code Schnipsel (Snippets) zu Wordpress, PHP, HTML, CSS, jQuery

     

    […] AS3 nicht ausreichen, kann man sich auch eigene schreiben. Wie das geht erkläre ich in meinem Blog, die Klasse für eigene Events gibts auch hier: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 […]

     
     
  2. 08.09.09 // 02:19 Uhr

    Timo

     

    Mit der prima Anleitung sieht das ja auf den ersten Blick fast machbar aus. Bin gespannt, wenn ich das ausprobiere gibt’s garantiert wieder ein Disaster… Danke jedenflalls!

     
     
  3. 05.10.09 // 15:32 Uhr

    Thomas Aull

     

    Ach quatsch :-) Wenn man da einmal durchgestiegen is, ist das im Grunde alles ganz logisch ;-)

     
     
  4. 05.01.10 // 13:08 Uhr

    [AS3] Problem mir eigenen Event f

     

    […] […]

     
     
  5. 21.01.10 // 11:47 Uhr

    Jürgen

     

    2 Daumen nach oben!

     
     
  6. 30.04.10 // 11:10 Uhr

    golo

     

    Hallo vielen Dank,
    ich versuche auch gerade die Event-Klasse zu erweitern, ich scheitere aber an folgendemunkt:

    Ich möchte einfach eine bekannte Eventart : MouseEvent.CLIC
    mit, wie in Deinem Beispiel mit data erweitern. Um einfach mehr Daten an den Event dran zu hängen…
    Aber wie ?

    Danke und Gruss Golo

     
     
  7. 30.04.10 // 11:24 Uhr

    Thomas Aull

     

    Hallo Golo,

    den Fall habe ich selbst noch nicht ausprobiert, aber du müsstest dann die MouseEvent- statt die Event-Klasse erweitern. Vielleicht geht´s aber auch viel leichter, dann müsste ich aber wissen was genau du vorhast :-)

     
     

Einen Kommentar schreiben

Name*
 
eMail* (unsichtbar)
 
Website
 
 

  • Letzte Kommentare

    • GravatarNico sagt:
      „Oh, der letzt kommentar ist aber schon lange her… braucht man überhaupt noch Einladungen?”
       
    • GravatarNico sagt:
      „Ich hätte gerne eine.”
       
    • GravatarKatharina sagt:
      „Also ich muss schon sagen, echt klasse umgesetzt. Ich selbst hab mit Flash so meine Probleme, aber du scheinst echt gut damit klar zu kommen. Mir gefallen...”
       
    • Gravatarbycan sagt:
      „Dankeschön! ^^ Genau das habe ich gerade gebraucht und war am rumprobieren.”
       
    • GravatarThomas Aull sagt:
      „Du hast vollkommen recht :-) Ich habs auch schon geändert, dankeschön!”
       
 

Weitere Artikel

 

Kategorien

 

Links