Documentación de Flash CS3 |
|||
| Programación con ActionScript 3.0 > Gestión de eventos > Objetos de evento | |||
Los objetos de evento tienen una doble finalidad en el nuevo sistema de gestión de eventos. En primer lugar, representan los eventos reales, almacenando para ello información acerca de eventos específicos en un conjunto de propiedades. En segundo lugar, contienen un conjunto de métodos que permiten manipular objetos de evento y alterar el comportamiento del sistema de gestión de eventos.
Para facilitar el acceso a estas propiedades y métodos, la API de Flash Player define una clase Event que constituye la clase base de todos los objetos de evento. La clase Event define un conjunto fundamental de propiedades y métodos que son comunes a todos los objetos de evento.
Esta sección comienza con una explicación de las propiedades de la clase Event, prosigue con una descripción de los métodos de la clase Event y finaliza con un análisis de las razones por las que existen subclases de la clase Event.
La clase Event define una serie de propiedades y constantes de sólo lectura que proporcionan información importante acerca de un objeto de evento. Las siguientes son especialmente importantes:
Event.type.Event.cancelable.Cada objeto de evento tiene un tipo de evento asociado. Los tipos de eventos se almacenan en la propiedad Event.type como valores de cadena. Resulta útil conocer el tipo de un objeto de evento, de manera que el código pueda distinguir objetos de distintos tipos. Por ejemplo, el siguiente código especifica que la función de detector clickHandler() debe responder a cualquier objeto de evento de clic del ratón que se pase a myDisplayObject:
myDisplayObject.addEventListener(MouseEvent.CLICK, clickHandler);
Existen unas dos docenas de tipos de eventos asociados a la clase Event, los cuales se representan con constantes de clase Event, algunas de las cuales se muestran en el siguiente extracto de la definición de la clase Event:
package flash.events
{
public class Event
{
// constantes de clase
public static const ACTIVATE:String = "activate";
public static const ADDED:String = "added";
// demás constantes omitidas por brevedad
}
}
Estas constantes proporcionan una forma sencilla de hacer referencia a tipos de eventos específicos. Es aconsejable utilizar estas constantes en lugar de las cadenas a las que representan. Si se escribe incorrectamente el nombre de una constante en el código, el compilador detectará el error, pero si se usan cadenas, un error tipográfico podría pasarse por alto durante la compilación y dar lugar a un comportamiento inesperado difícil de depurar. Por ejemplo, al añadir un detector de eventos, es preferible usar el siguiente código:
myDisplayObject.addEventListener(MouseEvent.CLICK, clickHandler);
en lugar de:
myDisplayObject.addEventListener("click", clickHandler);
El código puede comprobar si es posible impedir el comportamiento predeterminado de un objeto de evento en particular accediendo a la propiedad cancelable. La propiedad cancelable contiene un valor booleano que indica si es posible impedir un comportamiento predeterminado. Es posible impedir, o cancelar, el comportamiento predeterminado asociado a un reducido número de eventos usando el método preventDefault(). Para más información, consulte Cancelación del comportamiento predeterminado de eventos.
Las demás propiedades de la clase Event contienen información importante acerca de un objeto de evento y su relación con el flujo del evento, según se describe en la siguiente lista:
bubbles contiene información acerca de las partes del flujo del evento en el que participa el objeto de evento. eventPhase indica la fase en curso del flujo del evento. target almacena una referencia al destino del evento. currentTarget almacena una referencia al objeto de la lista de visualización que está procesando en ese momento el objeto de evento.Se dice que un evento se propaga ("bubbles", en inglés) si su objeto de evento participa en la fase de propagación del flujo del evento, lo que quiere decir que dicho objeto regresa desde el nodo de destino, a través de sus ascendientes, hasta alcanzar el objeto Stage. La propiedad Event.bubbles almacena un valor booleano que indica si el objeto de evento participa en la fase de propagación. Dado que todos los eventos que se propagan también participan en las fases de captura y destino, cualquier evento que se propague participa en las tres fases del flujo del evento. Si el valor es true, el objeto de evento participa en las tres fases. Si es false, el objeto de evento no participa en la fase de propagación.
Es posible determinar la fase del evento de un objeto de evento estudiando su propiedad eventPhase. La propiedad eventPhase contiene un valor entero sin signo que representa una de las tres fases del flujo del evento. La API de Flash Player define una clase EventPhase independiente que contiene tres constantes que se corresponden con los tres valores enteros sin signo, según se muestra en el siguiente extracto de código:
package flash.events
{
public final class EventPhase
{
public static const CAPTURING_PHASE:uint = 1;
public static const AT_TARGET:uint = 2;
public static const BUBBLING_PHASE:uint = 3;
}
}
Estas constantes corresponden a los tres valores válidos de la propiedad eventPhase. Es aconsejable usar estas constantes para hacer que el código sea más legible. Por ejemplo, para asegurarse de que una función denominada miFunc() sólo se llame si el destino del evento está en la fase de destino, es posible usar el siguiente código para probar dicha condición:
if (event.eventPhase == EventPhase.AT_TARGET)
{
myFunc();
}
La propiedad target contiene una referencia al objeto que es el destino del evento. En algunas situaciones esto resulta evidente, como cuando se activa un micrófono, en cuyo caso el destino del objeto de evento es el objeto Microphone. Sin embargo, si el destino se encuentra en la lista de visualización, es necesario tener en cuenta la jerarquía de ésta. Por ejemplo, si un usuario hace clic con el ratón en un punto que incluye objetos solapados de la lista de visualización, Flash Player siempre selecciona el objeto que se encuentra más lejos del objeto Stage como destino del evento.
En el caso de archivos SWF complejos, especialmente aquellos en los que los botones se decoran sistemáticamente con objetos secundarios menores, la propiedad target no puede usarse con demasiada frecuencia, ya que en muchas ocasiones señalará a los objetos secundarios de los botones en lugar de a los propios botones. En estas situaciones, lo habitual es añadir detectores de eventos al botón y usar la propiedad currentTarget, ya que ésta señala al botón, mientras que la propiedad target puede señalar a un elemento secundario del mismo.
La propiedad currentTarget contiene una referencia al objeto que está procesando en ese momento al objeto de evento. Aunque puede parecer extraño no saber qué nodo está procesando en ese momento al objeto de evento que se está examinando, es necesario recordar que se puede añadir una función de detector a cualquier objeto de visualización en el flujo del evento de ese objeto de evento y que dicha función puede colocarse en cualquier lugar. Además, es posible añadir la misma función de detector a distintos objetos de visualización. A medida que el tamaño y la complejidad de un proyecto crecen, la propiedad currentTarget resulta cada vez más útil.
Existen tres categorías de métodos en la clase Event:
Existen dos métodos de utilidad en la clase Event. El método clone(), que permite crear copias de un objeto de evento y el método toString(), que permite generar una representación de cadena de las propiedades de un objeto de evento junto con sus valores. El sistema de modelos de evento usa ambos métodos internamente, pero están a disposición de los desarrolladores para el uso general.
Los desarrolladores avanzados que deseen crear subclases de la clase Event deben sustituir e implementar versiones de ambos métodos de utilidad para asegurarse de que la subclase de eventos funcionará correctamente.
Se puede llamar al método Event.stopPropogation() o Event.stopImmediatePropogation() para impedir que un objeto de evento siga moviéndose por el flujo del evento. Ambos métodos son casi idénticos y sólo se diferencian en que uno permite que se ejecuten los demás detectores de eventos del nodo en curso y el otro no:
Event.stopPropogation() impide que el objeto de evento avance hasta el siguiente nodo, pero sólo después de permitir que se ejecuten todos los demás detectores de eventos del nodo en curso.Event.stopImmediatePropogation() también impide que el objeto de evento avance hasta el siguiente nodo, pero no permite que se ejecute ningún otro detector de eventos del nodo en curso.Las llamadas a cualquiera de estos dos métodos no afectan a la aplicación del comportamiento predeterminado asociado a un evento. Es necesario usar los métodos de comportamiento predeterminado de la clase Event para impedir dicho comportamiento.
Los dos métodos relacionados con la cancelación de comportamientos predeterminados son preventDefault() e isDefaultPrevented(). Para cancelar el comportamiento predeterminado asociado a un evento se usa el método preventDefault(), mientras que para comprobar si ya se ha llamado a preventDefault() en un objeto de evento, es necesario llamar al método isDefaultPrevented(), que devuelve el valor true si ya se ha llamado al método o false en caso contrario.
El método preventDefault() sólo funcionará si es posible cancelar el comportamiento predeterminado del evento. Se puede comprobar si esto es posible consultando la documentación de la API para ese tipo de evento o usando ActionScript para examinar la propiedad cancelable del objeto de evento.
La cancelación del comportamiento predeterminado no afecta al avance de un objeto de evento por el flujo del evento. Es necesario usar los métodos de flujo del evento de la clase Event para eliminar un objeto de evento del flujo del evento.
Para multitud de eventos, el conjunto de propiedades comunes definido en la clase Event es suficiente. No obstante, otros eventos tienen características únicas que no es posible capturar mediante las propiedades de la clase Event. Para esos casos, la API de Flash Player define varias subclases de la clase Event.
Cada subclase ofrece más propiedades y tipos de eventos que son únicas de esa categoría de eventos. Por ejemplo, los eventos relacionados con la entrada del ratón tienen algunas características únicas que no es posible capturar mediante las propiedades definidas en la clase Event. La clase MouseEvent amplía la clase Event añadiendo diez propiedades que contienen datos como la ubicación del evento de ratón y si se presionaron teclas específicas durante dicho evento.
Las subclases de Event también contienen constantes que representan los tipos de eventos asociados a la subclase. Por ejemplo, la clase MouseEvent define constantes para varios tipos de eventos de ratón e incluye los tipos de evento click, doubleClick, mouseDown y mouseUp.
Tal y como se describe en la sección Métodos de utilidad de la clase Event, al crear una subclase de Event es necesario sustituir los métodos clone() y toString() para ofrecer funcionalidad específica de la subclase.
Flash CS3
Enviarme un mensaje de correo electrónico cuando se añadan comentarios a esta página | Informe de comentarios
Página actual: http://livedocs.adobe.com/flash/9.0_es/main/00000138.html