Flashhilfe.de - Flash Community

[AS3] Klasse EventListenerManager für Flash, Flex und AIR [Flash 9]

 


AntwortenRegistrieren Seite1  

springer#1
Benutzerbild von springer
Beiträge: 4909
Wohnort: zuhaus
Registriert: Apr 2004

30.01.2009, 15:04

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:
1EventListenerManager.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
Werbung
Beiträge: 0
Registriert: Feb 2016


esteban01#2
Benutzerbild von esteban01
Beiträge: 1
Registriert: Sep 2009

18.09.2009, 20:11

Cool, genau sowas wollte ich für ein Projekt schreiben :)
Jetzt lese ich erstmal :)
Vielen Dank
springer#3
Benutzerbild von springer
Beiträge: 4909
Wohnort: zuhaus
Registriert: Apr 2004

Themenautor/in

23.09.2009, 10:56

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
th3_j0ker#4
Benutzerbild von th3_j0ker
Beiträge: 3
Registriert: Nov 2006

30.07.2010, 16:47

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
Werbung
Beiträge: 0
Registriert: Feb 2016


springer#5
Benutzerbild von springer
Beiträge: 4909
Wohnort: zuhaus
Registriert: Apr 2004

Themenautor/in

08.08.2010, 13:38

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
th3_j0ker#6
Benutzerbild von th3_j0ker
Beiträge: 3
Registriert: Nov 2006

24.08.2010, 02:01

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
springer#7
Benutzerbild von springer
Beiträge: 4909
Wohnort: zuhaus
Registriert: Apr 2004

Themenautor/in

24.08.2010, 08:37

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...
springer#8
Benutzerbild von springer
Beiträge: 4909
Wohnort: zuhaus
Registriert: Apr 2004

Themenautor/in

25.08.2010, 08:20

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...
th3_j0ker#9
Benutzerbild von th3_j0ker
Beiträge: 3
Registriert: Nov 2006

25.08.2010, 15:44

Hi,

hier noch meine Benchmark im Anhang

have fun
[schrift=verdana][/schrift][groesse=normal][/groesse][farbe=dunkel rot][/farbe]

Angehängte Dateien:
Komprimierte Datei ELMbench_1.zip44.75 KB
Geändert von th3_j0ker am 26.08.10 um 07:47 Uhr
springer#10
Benutzerbild von springer
Beiträge: 4909
Wohnort: zuhaus
Registriert: Apr 2004

Themenautor/in

25.08.2010, 21:05

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...

AntwortenRegistrieren Seite1  

Schnellantwort

Du musst registriert sein, um diese Funktion nutzen zu können.

 
Ähnliche Beiträge zum Thema
Partner Webseiten: art-and-law.de  Mediengestalter.info   php-resource.de   phpforum.de   phpwelt.de   Pixelio.de   Scubacube.de  
Haftungsausschluss   Datenschutzerklärung   Hier Werben   Impressum
© 1999-2019 Sebastian Wichmann - Flashhilfe.de