[AS3] Klasse EventListenerManager für Flash, Flex und AIR [Flash 9]
| 30.01.2009, 15:04 | | Beiträge: 4883 Wohnort: zuhaus Registriert: Apr 2004
| [AS3] Klasse EventListenerManager für Flash, Flex und AIR ich habe mal eine kleine nützliche klasse für eventListener geschrieben.
damit lassen sich sämtliche eventlistener auf objekten verwalten.
einen listener registrieren kann man folgendermassen:
ActionScript:| 1 | EventListenerManager.addClient(object,MouseEvent.CLICK,listener);
|
entfernen kann man einen listener so:
ActionScript:1 2 3 | EventListenerManager.removeClient(object); // entfernt alle eventlistener
EventListenerManager.removeClient(object,MouseEvent.CLICK); // entfernt alle eventlistener von typ MouseEvent.CLICK
EventListenerManager.removeClient(object,MouseEvent.CLICK,listener); // entfernt alle eventlistener von typ MouseEvent.CLICK mit dem listener "listener"
|
zusätzlich lassen sich für mouseEvents die objekte inaktiv/aktiv schalten, mit angabe ob untergeordnete objekte ebenfalls davon betroffen sein sollen
ActionScript:1 2 | EventListenerManager.disableClient(obj); // schaltet die untergeordnete objekte inaktiv
EventListenerManager.disableClient(obj,true); // lässt die untergeordnete objekte aktiv
|
im anhang hat es auch noch eine swf mit dabei, mit ein paar beispielen...
ich überlege noch wie man es bezüglich den prioritäten der events sinnvoll lösen könnte.
sprich: 2x MouseEvent.CLICK registrieren, und bestimmen welcher zuerst gefeuert wird.
dies sollte dann auch für mehr als 2 funktionieren, und sollte auch nachträglich veränderbar sein....
ich werde hier dann updaten... hoffe das nützt dem einen oder anderen, da der manager zum beispiel auch etwas nützt wenn man die carbage collection im auge behalten will....
dann könnte man sicher gehen, dass zb. auf einem clip keine listener mehr hocken:
ActionScript:1 2 | EventListenerManager.removeClient(clip);
removeChild(clip); // die garbage collection lässt unter umständen grüssen...
|
hier noch das script vom beispiel aus dem anhang ( nicht sehr schön ):
ActionScript:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | import de.flashhilfe.managers.EventListenerManager;
function listener0(event:MouseEvent):void{
trace("blackField click 1")
}
function listener1(event:MouseEvent):void{
trace("blackField click 2")
}
function listener2(event:MouseEvent):void{
trace("blackField rollover")
}
function listener3(event:MouseEvent):void{
trace("blackfield rollout")
}
function listener4(event:MouseEvent):void{
trace("redField click")
}
function listener5(event:MouseEvent):void{
trace("redField rollover")
}
function listener6(event:MouseEvent):void{
trace("greenField click")
}
this.butn_addall.addEventListener(MouseEvent.CLICK,all);
function all(event:MouseEvent):void{
EventListenerManager.addClient(this.butn,MouseEvent.CLICK,listener0);
EventListenerManager.addClient(this.butn,MouseEvent.CLICK,listener1);
EventListenerManager.addClient(this.butn,MouseEvent.ROLL_OVER,listener2);
EventListenerManager.addClient(this.butn,MouseEvent.ROLL_OUT,listener3);
EventListenerManager.addClient(this.butn.butn,MouseEvent.CLICK,listener4,false);
EventListenerManager.addClient(this.butn.butn,MouseEvent.ROLL_OVER,listener5);
EventListenerManager.addClient(this.butn.butn.butn,MouseEvent.CLICK,listener6);
}
this.butn_removeall.addEventListener(MouseEvent.CLICK,clickWeg);
function clickWeg(event:MouseEvent):void{
EventListenerManager.removeClient(this.butn)
}
this.butn_remove1.addEventListener(MouseEvent.CLICK,clickWeg2);
function clickWeg2(event:MouseEvent):void{
EventListenerManager.removeClient(this.butn,MouseEvent.CLICK,listener0)
}
this.butn_dis.addEventListener(MouseEvent.CLICK,dis);
function dis(event:MouseEvent):void{
EventListenerManager.disableClient(this.butn,this.box1.selected);
}
this.butn_en.addEventListener(MouseEvent.CLICK,en);
function en(event:MouseEvent):void{
EventListenerManager.enableClient(this.butn,this.box0.selected);
}
|
EventListenerManager.zip (21.64 KB)
anregungen/verbesserungen sind herzlich willkommen ;-)lieber chips essen und danach voller zweifel sein, als voller zweifel chips essen... | Geändert von springer am 08.08.10 um 21:21 Uhr
| |
|
| 18.09.2009, 20:11 | Re1 | Beiträge: 1 Registriert: Sep 2009
| Cool, genau sowas wollte ich für ein Projekt schreiben :)
Jetzt lese ich erstmal :)
Vielen Dank | |
| 23.09.2009, 10:56 | Re2 | Beiträge: 4883 Wohnort: zuhaus Registriert: Apr 2004
Themenautor/in
| hi esteban,
die funktion removeAllClients könnte irgendwie so aussehen:
ActionScript:1 2 3 4 5 | public static function removeAllClients():void{
for(var i:uint = 0; i < this._clients.length; i++){
removeClient( this._clients[i].client );
}
}
|
oder noch mit der option nur bestimmte events zu removen, von allen clients die einen eventtype haben...
ActionScript:1 2 3 4 5 | public static function removeAllClients(event:String = null,listener:Function = null):void{
for(var i:uint = 0; i < this._clients.length; i++){
removeClient( this._clients[i].client, event, listener );
}
}
|
lieber chips essen und danach voller zweifel sein, als voller zweifel chips essen... | Geändert von springer am 23.09.09 um 11:02 Uhr
| |
|
| | | nicht sichtbar bei eingeloggten Mitgliedern |
|
| 30.07.2010, 16:47 | Re3 | Beiträge: 3 Registriert: Nov 2006
| hi springer,
ich habe auch einen EventListenerManager geschrieben.
Mit meinem kann man Gruppen erstellen, und diese de/aktivieren oder entfernen,
und sich auch div. traces für debugging zwecke ausgeben lassen,
und seit der letzten Version eine Profiling Methode aktivieren für custom traces.
http://code.google.com/p/as3listenermanager/
Grüße
Michael[schrift=verdana][/schrift][groesse=normal][/groesse][farbe=dunkel rot][/farbe] | Geändert von th3_j0ker am 30.07.10 um 16:49 Uhr
| |
|
| 08.08.2010, 13:38 | Re4 | Beiträge: 4883 Wohnort: zuhaus Registriert: Apr 2004
Themenautor/in
| hmm, das mit den gruppen finde ich eine coole sache. ich hab mich darauf gerade an meine managerklasse rangesetzt und es ebenfalls eingebaut.
Beispiel:
ActionScript:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | // fügt eventlistener hinzu
EventListenerManager.add( b, MouseEvent.CLICK, this.clickListener0, null, "group0" );
EventListenerManager.add( b, MouseEvent.CLICK, this.clickListener1, null, "group0" );
EventListenerManager.add( b, MouseEvent.ROLL_OVER, this.overListener0, null, "group0" );
EventListenerManager.add( b, MouseEvent.ROLL_OUT, this.outListener0, null, "group0" );
// alle deactivate-funktionen sind identisch mit "activate"
// Deaktiviert alle listener von b
EventListenerManager.deactivate( b );
// Deaktiviert alle listener von b in gruppe group0
EventListenerManager.deactivate( b, null, null, "group0" );
// Deaktiviert alle listener vom typ MouseEvent.CLICK von b in gruppe group0
EventListenerManager.deactivate( b, MouseEvent.CLICK, null, "group0" );
// Deaktiviert alle listener vom typ MouseEvent.CLICK von b in allen gruppen
EventListenerManager.deactivate( b, MouseEvent.CLICK, null );
// Deaktiviert alle listener vom typ MouseEvent.CLICK, mit einem bestimmten listener, von b in allen gruppen
EventListenerManager.deactivate( b, MouseEvent.CLICK, clickListener0 );
// Deaktiviert alle listener vom typ MouseEvent.CLICK, mit einem bestimmten listener, von b in gruppe group0
EventListenerManager.deactivate( b, MouseEvent.CLICK, clickListener0, "group0" );
// variante bei allen funktionen möglich. hier werden auch alle listener in allen gruppen entfernt
EventListenerManager.overlapGroups = true;
EventListenerManager.deactivate( b, MouseEvent.CLICK, clickListener0, "group0" );
// die gruppenfunktionen funktionieren gleich mit den optionalen parametern
// Deaktiviert eine komplette gruppe mit allen eventlistenern
EventListenerManager.deactivateGroup( "group0", null, null );
// Deaktiviert eine komplette gruppe mit allen eventlistenern vom typ MouseEvent.CLICK
EventListenerManager.deactivateGroup( "group0", MouseEvent.CLICK, null );
// Deaktiviert eine komplette gruppe mit allen eventlistenern vom typ MouseEvent.CLICK mit einem bestimmten listener
EventListenerManager.deactivateGroup( "group0", MouseEvent.CLICK, clickListener0 );
// deaktiviert alle gruppen
EventListenerManager.deactivateGroups( null, null, false );
// deaktiviert in allen gruppen listener vom typ MouseEvent.CLICK
EventListenerManager.deactivateGroups( MouseEvent.CLICK, null );
// deaktiviert in allen gruppen listener vom typ MouseEvent.CLICK mit einem bestimmten listener
EventListenerManager.deactivateGroups( MouseEvent.CLICK, clickListener0 );
// auch bei diesen ist es in Kombination mit
EventListenerManager.overlapGroups = true;
// möglich, auch die events in allen gruppen zu manipulieren
// Entfernt alle eventlistener von b
EventListenerManager.remove( b );
// Entfernt alle eventlistener von b vom typ MouseEvent.CLICK
EventListenerManager.remove( b, MouseEvent.CLICK );
// Entfernt alle eventlistener von b vom typ MouseEvent.CLICK mit einem bestimmten listener
EventListenerManager.remove( b, MouseEvent.CLICK, clickListener0 );
// entfernt alle eventlistener in einer gruppe
EventListenerManager.removeGroup( "group0" );
// entfernt alle eventlistener in einer gruppe vom typ MouseEvent.CLICK
EventListenerManager.removeGroup( "group0", MouseEvent.CLICK );
// entfernt alle eventlistener in einer gruppe vom typ MouseEvent.CLICK mit einem bestimmten listener
EventListenerManager.removeGroup( "group0", MouseEvent.CLICK, clickListener0 );
// entfernt alle eventlistener in allen gruppen
EventListenerManager.removeGroups();
// entfernt alle eventlistener in allen gruppen vom typ MouseEvent.CLICK
EventListenerManager.removeGroups( MouseEvent.CLICK );
// entfernt alle eventlistener in allen gruppen vom typ MouseEvent.CLICK mit einem bestimmten listener
EventListenerManager.removeGroups( MouseEvent.CLICK, clickListener0 );
// setzt bei einem bestimmten listener in einer bestimmten gruppe die priorität auf 100
EventListenerManager.applyOptions( b, {priority:100}, MouseEvent.CLICK, clickListener0, "group0" );
// setzt bei einem bestimmten listener in allen gruppen die priorität auf 100
EventListenerManager.applyOptions( b, {priority:100}, MouseEvent.CLICK, clickListener0 );
// setzt bei allen listeners vom typ MouseEvent.CLICK in einer bestimmten gruppe die priorität auf 100
EventListenerManager.applyOptions( b, {priority:100}, MouseEvent.CLICK, null, "group0" );
// setzt bei allen listeners vom typ MouseEvent.CLICK in allen gruppen die priorität auf 100
EventListenerManager.applyOptions( b, {priority:100}, MouseEvent.CLICK );
// setzt bei allen listeners in einer bestimmten gruppe die priorität auf 100
EventListenerManager.applyOptions( b, {priority:100}, null, null, "group0" );
// setzt bei allen listeners in allen gruppen die priorität auf 100
EventListenerManager.applyOptions( b, {priority:100} );
// mögliche optionen:
EventListenerManager.applyOptions( b, {priority:100,useWeakReference:true,useCapture:false});
|
LINK: http://code.google.com/p/as3eventlistenermanager/lieber chips essen und danach voller zweifel sein, als voller zweifel chips essen... | Geändert von springer am 08.08.10 um 13:52 Uhr
| |
|
| 24.08.2010, 02:01 | Re5 | Beiträge: 3 Registriert: Nov 2006
| Hi springer,
das mit dem http://code.google.com/p/as3eventlistenermanager/
finde ich fast ein bisschen frech, da mein Projekt unter http://code.google.com/p/as3listenermanager/ gehosted wird, und es so leicht zur Verwechslung kommen kann :)
Ich habe eine Benchmark geschrieben, und die Ergebnisse als Diagramme in meinem Wiki released.
Dort wird Dein EventListenerManager, mit den rabbits eManager und meinen ELM Versionen verglichen anhand von benötigter Zeit und Speicherausnutzung.
Dein EventListenerManager schließt soweit ganz gut ab was die Speichernutzung angeht.
Geschwindigkeitsmässig gibt es da aber noch Optimierungspotential
ist der langsamste in der gesamt benötigten Zeit und bei removeEventListener.
http://code.google.com/p/as3listenermanager/wiki/Benchmark
Grüße
Michael
P.S.:
Warum setzt Du useWeakReference = true?
Ein Vector ist schneller wie ein Dictionary![schrift=verdana][/schrift][groesse=normal][/groesse][farbe=dunkel rot][/farbe] | Geändert von th3_j0ker am 24.08.10 um 02:05 Uhr
| |
|
| | | nicht sichtbar bei eingeloggten Mitgliedern | 
|
| 24.08.2010, 08:37 | Re6 | Beiträge: 4883 Wohnort: zuhaus Registriert: Apr 2004
Themenautor/in
| hi,
danke für deine Tests, interessant ;-)
>> Warum setzt Du useWeakReference = true?
ich wollte die Signatur der Funktion (von IEventDispatcher) beibehalten, daher hab ich das so gemacht....
>> Ein Vector ist schneller wie ein Dictionary!
das ist richtig, gibts aber erst ab flashplayer 10...
Sprachversion: ActionScript 3.0
Laufzeitversionen: Flash Player 10, AIR 1.5, Flash Lite 4
>> finde ich fast ein bisschen frech, da mein Projekt unter http://code.google.com/p/as3listenermanager/ gehosted wird, und es so leicht zur Verwechslung kommen kann :)
ja, ist etwas ungünstig... aber ein besserer name ist mir nicht eingefallen. und mein Manager hiess schon vorher EventListenerManager und ist von daher nicht kopiert. klar, deiner ist schon seit juli 08 online, aber den kannte ich damals nicht... ;-)
ich werde bei gelegenheit mal eine optimierungsrunde einlegen, für die remove-funktion... sollte noch was rauszuholen sein...lieber chips essen und danach voller zweifel sein, als voller zweifel chips essen... | |
| 25.08.2010, 08:20 | Re7 | Beiträge: 4883 Wohnort: zuhaus Registriert: Apr 2004
Themenautor/in
| ich habe auch noch getestet, bin jedoch zu etwas anderen Resultaten gekommen....
beim adden ist deine funktion ELM.add() schneller als meine add(), durchschnittlich um ca. 2%. (0.104 : 0.123 s). beim removen ist meine aber mehr als 3x schneller ( 7.678 : 2.276 s )....
verglichen hab ich beim removen deine removeObj() mit meiner remove() funktion....lieber chips essen und danach voller zweifel sein, als voller zweifel chips essen... | |
| 25.08.2010, 15:44 | Re8 | Beiträge: 3 Registriert: Nov 2006
| Hi,
hier noch meine Benchmark im Anhang
have fun[schrift=verdana][/schrift][groesse=normal][/groesse][farbe=dunkel rot][/farbe]
Angehängte Dateien:
| Geändert von th3_j0ker am 26.08.10 um 07:47 Uhr
| |
|
| 25.08.2010, 21:05 | Re9 | Beiträge: 4883 Wohnort: zuhaus Registriert: Apr 2004
Themenautor/in
| bitte diesen thread nicht weiterführen. erstelle bitte einen neuen dafür. das tipps und tricks - forum sollte möglichst schlank gehalten werden ;-)lieber chips essen und danach voller zweifel sein, als voller zweifel chips essen... | |
| | Themen Ähnliche Beiträge zum Thema | 27.02.2009 - niquito12 27.02.2009 - niquito12 18.03.2009 - magic1980 18.05.2009 - 23tux |
|
Flashhilfe.de Flash Platform Tipps & Tutorials Flash Platform Andere Programmiersprachen Jobangebote Diskussionen
Flashhilfe News 
31.01.12, 12:30#Jobs Wir suchen (freiberufliche) Flash Developer (m/w) in Köln/Aachen http://t.co/4WPsXPOA 20.01.12, 21:02#Jobs Flash-Projekt Produktkonfigurator http://t.co/qPlGSiPd 12.01.12, 18:50#Jobs Flash Freelancer für ca. 2 Wochen in München gesucht http://t.co/XpMJr5dv 10.01.12, 10:45#PureMVC vs #RobotLegs Performance Battle. PureMVC is significantly faster than RobotLegs in nearly every respect. http://t.co/324gWRAr 06.01.12, 21:37#Jobs Flash Developer in Hamburg gesucht http://t.co/hZgTZvHJ
Regeln & Bedingungen
|