Pregunta

Así que quiero una manera de configurar eventos para que pueda pasar datos sin crear cierres \ pérdidas de memoria. Esto es por lo que yo he conseguido:

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

Esto me pone el siguiente comportamiento:

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]

Mi objetivo es conseguir que los datos personalizados quiero pasar a conseguir pasar de los fuegos evento flash, no sólo la que yo fuego. Por ejemplo, lo que si quería pasar un clip de película, junto con un evento Loader.complete para poner en el mapa de bits resultante?

¿Fue útil?

Solución

ampliado la clase de eventos para que despachar con los datos adicionales, ahora si quieres la clase Loader para despachar el tipo de evento personalizado, extender la clase Loader para hacer eso (o cualquier otra clase que desea hacer esto con). En este ejemplo voy a invalidar URLLoader con esta funcionalidad (porque en realidad cargador distribuye eventos desde su contentLoaderInfo, que necesita dos clases sobrescritos, y sólo quiero que sea sencillo)


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

Ahora, para utilizar esto con su clase CustomEvent probar este código en su 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! los datos personalizados en sus eventos de forma innata enviados!

Otros consejos

A continuación se muestra la manera más limpia para crear un evento personalizado. Por lo general los tipos de eventos tienen referencias estáticas públicas escritas en todas las letras mayúsculas. Cuando se envía un evento, que pasa a un evento, o CustomEvent, objeto con el método de controlador de eventos. Aquí es donde puede recuperar su valor pasado.

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

Cuando distribuyen eventos, se crea una nueva instancia del evento que se pasa como tales.

private var _someValue:int = 12;
dispatchEvent(new CustomEvent(_somevalue));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top