ActionScript 3
Trabajando con eventos
Buscar..
Observaciones
Los eventos son piezas de datos que un programa puede crear, intercambiar y reaccionar. El flujo de eventos asíncronos se distribuye a través de la lista de visualización por el motor de Flash como una reacción ante eventos externos, como los movimientos del mouse u otro marco que se muestra. Cada otro flujo de eventos y todo el procesamiento de eventos es síncrono, por lo que si un fragmento de código ha generado un evento, todas las reacciones en él se procesan antes de que se ejecute la siguiente línea de código, también si hay varios oyentes de un evento, todos ellos Habría corrido antes de que el próximo evento pudiera ser procesado.
Hay varios eventos importantes asociados con la programación de Flash. Event.ENTER_FRAME
se genera antes de que Flash dibuje otro marco, señala la lista de visualización completa para prepararse para dibujarse, y se puede usar como un temporizador síncrono. MouseEvent.CLICK
y sus hermanos se pueden usar para recibir información del mouse del usuario, y TouchEvent.TOUCH_TAP
es un análogo para las pantallas táctiles. KeyboardEvent.KEY_DOWN
y KEY_UP
proporcionan medios para recibir la entrada del usuario desde el teclado, sin embargo, su uso en el departamento móvil es casi imposible debido a que los dispositivos no tienen teclado físico. Finalmente, Event.ADDED_TO_STAGE
se distribuye una vez que un objeto de visualización recibe acceso a la etapa, y se incluye en la lista de visualización global que recibe la totalidad de los eventos que pueden subir y bajar la lista de visualización.
La mayoría de los eventos en Flash son componentes específicos. Si está diseñando su propio componente que usará eventos de Flash, use una clase descendiente flash.events.Event
y sus propiedades de String
estáticas para crear el conjunto de eventos de su componente.
Eventos personalizados con datos de eventos.
package
{
import flash.events.Event;
public class CustomEvent extends Event
{
public static const START:String = "START";
public static const STOP:String = "STOP";
public var data:*;
public function CustomEvent(type:String, data:*,
bubbles:Boolean=false, cancelable:Boolean=false)
{
super(type, bubbles, cancelable);
if (data)
this.data = data;
}
}
}
Para enviar un evento personalizado:
var dataObject:Object = {name: "Example Data"};
dispatchEvent(new CustomEvent(CustomEvent.START, dataObject))
Para escuchar eventos personalizados:
addEventListener(CustomEvent.STOP, stopHandler);
function stopHandler(event:CustomEvent):void
{
var dataObject:* = event.data;
}
Manejo de eventos fuera de la lista de visualización
package {
import flash.events.EventDispatcher;
public class AbstractDispatcher extends EventDispatcher {
public function AbstractDispatcher(target:IEventDispatcher = null) {
super(target);
}
}
}
Para enviar un evento en una instancia:
var dispatcher:AbstractDispatcher = new AbstractDispatcher();
dispatcher.dispatchEvent(new Event(Event.CHANGE));
Para escuchar eventos en una instancia:
var dispatcher:AbstractDispatcher = new AbstractDispatcher();
dispatcher.addEventListener(Event.CHANGE, changeHandler);
function changeHandler(event:Event):void
{
}
Manejo básico de eventos
Flash despacha Events
para la mayoría de sus objetos. Uno de los eventos más básicos es ENTER_FRAME
, que se distribuye (a la velocidad de cuadros del SWF) en cada objeto de la lista de visualización.
import flash.display.Sprite;
import flash.events.Event;
var s:Sprite = new Sprite();
s.addEventListener(Event.ENTER_FRAME, onEnterFrame);
function onEnterFrame(e:Event)
{
trace("I am called on every frame !");
}
Esta función se llamará de forma asíncrona en cada fotograma. Esto significa que la función que asigna como el controlador de eventos onEnterFrame
se procesa antes que cualquier otro código ActionScript que se adjunte a los marcos afectados.
Añade tus propios eventos
Puede crear sus propios eventos y enviarlos, extendiendo la clase Event
.
import flash.events.Event;
class MyEvent extends Event
{
var data: String;
static public var MY_EVENT_TYPE = "my_event_my_event_code";
public function MyEvent(type: String, data: String)
{
this.data = data;
}
override public function clone():Event
{
return new MyEvent(type, data);
}
}
Luego puede enviarlo y escucharlo, usando un EventDispatcher
. Tenga en cuenta que la mayoría de los objetos flash son despachadores de eventos.
import flash.events.EventDispatcher;
var d = new EventDispatcher();
d.addEventListener(MyEvent.MY_EVENT_TYPE, onType);
function onType(e: MyEvent)
{
trace("I have a string: "+e.data);
}
d.dispatchEvent(new MyEvent(MyEvent.MY_EVENT_TYPE, "Hello events!"));
Tenga en cuenta que el método de clone
es obligatorio si desea volver a ver su evento.
Estructura de evento de ratón simple
A través del uso de event types
de event types
, puede reducir fácilmente la acumulación de código que ocurre a menudo cuando se definen eventos para muchos objetos en el escenario filtrando eventos en una función en lugar de definir muchas funciones de manejo de eventos.
Imagina que tenemos 10 objetos en el escenario llamados object1
, object2
... object10
Podrías hacer lo siguiente:
var i: int = 1;
while(getChildByName("object"+i) != null){
var obj = getChildByName("object"+i)
obj.addEventListener(MouseEvent.CLICK, ObjectMouseEventHandler);
obj.addEventListener(MouseEvent.MOUSE_OVER, ObjectMouseEventHandler);
obj.addEventListener(MouseEvent.MOUSE_OUT, ObjectMouseEventHandler);
obj.alpha = 0.75;
i++;
}
function ObjectMouseEventHandler(evt:Event)
{
if(evt.type == "click")
{
trace(evt.currentTarget + " has been clicked");
}
else
{
evt.currentTarget.alpha = evt.type == "mouseOver" ? 1 : 0.75;
}
}
Los beneficios de este método incluyen:
- No es necesario especificar la cantidad de objetos para aplicar eventos.
- No es necesario saber específicamente con qué objeto interactuó y aún así aplicar la funcionalidad.
- Fácilmente aplicando eventos a granel.