Comment puis-je modifier les événements AS3 existants afin que je puisse transmettre des données?

StackOverflow https://stackoverflow.com/questions/758322

Question

Je veux un moyen de mettre en place des événements afin que je puisse transmettre des données sans créer de fermetures \ fuites de mémoire. Ceci est aussi loin que j'ai:

package com.events {
    import flash.events.Event;

    public class CustomEvent extends Event {
        public static const REMOVED_FROM_STAGE:String = "removedFromStage";
        public var data:*;

        public function CustomEvent(type:String, customData:*=null, bubbles:Boolean=false, cancelable:Boolean=false) {
            super(type, bubbles, cancelable);
            this.data = customData;
        }

        public override function clone():Event {
            return new CustomEvent(type, data, bubbles, cancelable);
        }

        public override function toString():String {
            return formatToString("CustomEvent", "type", "data", "bubbles", "cancelable", "eventPhase");
        }
    }
}

Cela me obtient le comportement suivant:

function testme(e:Event) {
    trace(e); 
}

test_mc.addEventListener(CustomEvent.REMOVED_FROM_STAGE, testme);
test_mc.dispatchEvent(new CustomEvent(CustomEvent.REMOVED_FROM_STAGE, 42));
//Traces [CustomEvent type="removedFromStage" data=42 bubbles=false cancelable=false eventPhase=2]
removeChild(test_mc);
//Traces [Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2]

Mon but est d'obtenir les données personnalisées que je veux passer pour se passer des flash se déclenche l'événement, pas seulement celui que je feu. Par exemple, si je voulais passer un MovieClip avec un événement Loader.complete pour mettre le bitmap résultat?

Était-ce utile?

La solution

vous avez étendu la classe Event pour elle d'envoyer des données supplémentaires, maintenant si vous voulez la classe Loader pour expédier votre type d'événement personnalisé, étendre la classe Loader pour le faire (ou de toute autre classe que vous voulez faire avec). Dans cet exemple, je vais passer outre URLLoader avec cette fonctionnalité (parce que Loader envoie en fait des événements à partir de son contentLoaderInfo, qui a besoin de deux classes surchargées, et je veux juste rester simple)


package com.net
{
    import flash.net.URLLoader;
    import flash.events.Event;

    import com.events.CustomEvent;

    public class CustomLoader extends URLLoader
    {
        // URLLoader already has a data property, so I used extraData
        public var extraData:*;

        override public function dispatchEvent(event: Event) : Boolean
        {
            var customEvent: CustomEvent = new CustomEvent(event.type, extraData, event.bubbles, event.cancelable);
            return super.dispatchEvent(customEvent);
        }
    }
}

Maintenant, pour utiliser avec votre classe CustomEvent essayez ce code dans votre fla


import com.net.CustomLoader;
import com.events.CustomEvent;

var loader: CustomLoader = new CustomLoader();
loader.extraData = "Extra Data";
loader.load(new URLRequest("test.xml"));
loader.addEventListener(Event.COMPLETE, loadComplete);

function loadComplete(event: CustomEvent) : void
{
    trace(event.data); // Extra Data
}

BAM! données personnalisées sur vos événements! dépêchés naturellement

Autres conseils

Ce qui suit montre la plus propre façon de créer un événement personnalisé. En règle générale les types d'événements ont des références statiques publiques tapées dans toutes les lettres majuscules. Lorsqu'un événement est distribué, il passe un événement, ou CustomEvent, objet de la méthode de gestionnaire d'événement. C'est là que vous pouvez récupérer votre valeur passée.

package com.hodgedev.events 
{
    import flash.events.Event;

    public class CustomEvent extends Event 
    {
        public static const VALUE_CHANGED:String = "VALUE_CHANGED";
        public var value:Number;

        public function CustomEvent(pValue:Number) 
        { 
            super(CustomEvent.VALUE_CHANGED);
            value = pValue;
        } 
        public override function clone():Event 
        { 
            return new CustomEvent(value);
        }
    }
}

Quand nous envoyons des événements, nous créons une nouvelle instance de l'événement à passer en tant que tel.

private var _someValue:int = 12;
dispatchEvent(new CustomEvent(_somevalue));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top