Domanda

Quindi voglio un modo per impostare gli eventi in modo che possa passare i dati senza creare chiusure \ perdite di memoria. Questo è quanto ho avuto:

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");
        }
    }
}

Questo mi ottiene il seguente comportamento:

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]

Il mio obiettivo è quello di ottenere i dati personalizzato voglio passare per avere superato dai flash evento, non solo quello che ho fuoco. Per esempio, che se volevo passare un movieclip con un evento Loader.complete per mettere la bitmap con conseguente?

È stato utile?

Soluzione

È esteso la classe Event per farlo a pezzi con dati aggiuntivi, ora se si desidera che la classe Loader di spedire il vostro tipo di evento personalizzato, estendere la classe Loader per fare questo (o qualsiasi altra classe che si vuole fare questo con). In questo esempio ho sovrascriveremo URLLoader con questa funzionalità (perché Loader invia in realtà gli eventi da esso è contentLoaderInfo, che ha bisogno di due classi override, e voglio solo per mantenere le cose semplici)


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);
        }
    }
}

Ora per utilizzare questo con la classe CustomEvent provare questo codice nel tuo .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! dati personalizzati sui vostri eventi innato inviati!

Altri suggerimenti

Di seguito le proponiamo il modo più pulito per creare un evento personalizzato. In genere i tipi di evento hanno riferimenti statici pubblici digitati in tutte le lettere Campidoglio. Quando un evento viene inviato, passa un evento, o CustomEvent, oggetto al metodo del gestore dell'evento. Questo è dove si può recuperare il valore passato.

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);
        }
    }
}

Quando si inviano eventi, creiamo una nuova istanza della manifestazione per essere passato come tale.

private var _someValue:int = 12;
dispatchEvent(new CustomEvent(_somevalue));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top