2009-04-16 7 views
7

Así que quiero una forma de configurar eventos para que pueda pasar datos sin crear cierres \ pérdida de memoria. Esto es por lo que yo he conseguido:¿Cómo modifico los eventos AS3 existentes para poder pasar los datos?

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 caso de flash , no solo el que dispare. Por ejemplo, ¿qué pasaría si quisiera pasar un clip de película junto con un evento loader.COMPLETE para poner el mapa de bits resultante?

Respuesta

4

Extendió la clase de evento para enviar datos adicionales, ahora si desea que la clase Loader envíe su tipo de evento personalizado, amplíe la clase Loader para hacer eso (o cualquier otra clase con la que desee hacer esto) . En este ejemplo voy a invalidar URLLoader con esta funcionalidad (porque cargador realidad 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 utilizar esto con su CustomEvent clase intente 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! Datos personalizados en sus eventos enviados por correo!

+0

podría por favor dar un ejemplo de usted CustomEvent class –

+0

nevermind. :) http://www.charglerode.com/blog/?p=51 –

+0

http://stackoverflow.com/questions/762521/custom-as3-loader-class-that-uses-a-custom-loaderinfo-class –

0

A continuación se muestra la forma más limpia de crear un evento personalizado. Normalmente, los tipos de eventos tienen referencias estáticas públicas escritas en todas las letras capitales. Cuando se distribuye un evento, pasa un evento o evento CustomEvent al método del controlador de eventos. Aquí es donde puedes recuperar tu 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 enviamos eventos, creamos una nueva instancia del evento que se pasará como tal.

private var _someValue:int = 12; 
dispatchEvent(new CustomEvent(_somevalue)); 
+0

Él tiene una clase de evento personalizado para datos personalizados, se preguntaba cómo hacer que los eventos normales despachen esa clase, llevando esa información adicional :) –

Cuestiones relacionadas