Oggetti evento

Flash Player 9 e versioni successive, Adobe AIR 1.0 e versioni successive

Nel nuovo sistema di gestione degli eventi, gli oggetti evento svolgono due funzioni principali. Innanzi tutto, gli oggetti evento rappresentano veri e propri eventi in quanto ne memorizzano le proprietà. Secondariamente, gli oggetti evento contengono una serie di metodi che permettono di manipolare gli oggetti stessi e di influenzare il comportamento del sistema di gestione degli eventi.

Allo scopo di facilitare l'accesso a tali proprietà e metodi, l'API di Flash Player definisce una classe Event che funge da classe base per tutti gli oggetti evento. La classe Event definisce una serie di proprietà e metodi fondamentali comuni a tutti gli oggetti evento.

Questa sezione inizia presentando le proprietà della classe Event, per passare quindi alla descrizione dei metodi della classe Event e concludersi spiegando lo scopo delle sottoclassi della classe Event.

Nozioni fondamentali sulle proprietà della classe Event

La classe Event definisce varie proprietà e costanti non modificabili che forniscono informazioni importanti sull'oggetto evento. Ecco le più importanti:

  • I tipi di oggetto evento sono rappresentati da costanti e memorizzati nella proprietà Event.type .

  • La possibilità di disattivare un comportamento predefinito di un evento è rappresentata da un valore booleano e registrata nella proprietà Event.cancelable .

  • Le informazioni sul flusso di eventi sono contenute nelle proprietà rimanenti.

Tipi di oggetti evento

Ogni oggetto evento è associato a un tipo di evento. I tipi di evento sono registrati nella proprietà Event.type sotto forma di valori stringa. È utile conoscere il tipo a cui appartiene un oggetto evento per permettere al codice di distinguere tra loro gli oggetti che appartengono a tipi diversi. L'esempio di codice seguente specifica che la funzione listener clickHandler() deve rispondere a qualsiasi oggetto evento click del mouse passato a myDisplayObject :

myDisplayObject.addEventListener(MouseEvent.CLICK, clickHandler);

Alla classe Event sono associate circa una ventina di tipi di evento che sono rappresentati da costanti della classe Event. Alcune di queste costanti sono indicate nella porzione di codice che rappresenta la definizione della classe Event:

package flash.events 
{ 
    public class Event 
    { 
        // class constants 
        public static const ACTIVATE:String = "activate"; 
        public static const ADDED:String= "added"; 
        // remaining constants omitted for brevity 
    } 
}

Queste costanti rappresentano un modo semplice per fare riferimento a tipi di evento specifici. Si consiglia di usare le costanti al posto delle stringhe che rappresentano perché il compilatore è in grado di rilevare un eventuale errore di ortografia nel nome di una costante. Se invece fate un errore di ortografia in una stringa, l'errore potrebbe passare inosservato in fase di compilazione ma generare comportamenti imprevisti che sarebbero difficili da individuare in seguito. Per aggiungere un listener di eventi, ad esempio, utilizzate il codice seguente:

myDisplayObject.addEventListener(MouseEvent.CLICK, clickHandler);

anziché:

myDisplayObject.addEventListener("click", clickHandler);

Informazioni sui comportamenti predefiniti

Il codice può verificare se è possibile disattivare il comportamento predefinito di un oggetto evento analizzando la proprietà cancelable . La proprietà cancelable contiene un valore booleano che indica se un comportamento predefinito può essere disattivato. Potete disattivare, cioè annullare, il comportamento predefinito associato a un piccolo numero di eventi usando il metodo preventDefault() . Per ulteriori informazioni, vedete la sezione Disattivazione del comportamento predefinito di un evento in Nozioni fondamentali sui metodi della classe Event .

Informazioni sul flusso di eventi

Le proprietà rimanenti della classe Event contengono informazioni importanti sull'oggetto evento e il suo rapporto con il flusso di eventi, come descritto nell'elenco seguente:

  • La proprietà bubbles contiene informazioni sulle parti del flusso a cui l'oggetto evento partecipa.

  • La proprietà eventPhase indica la fase corrente del flusso di eventi.

  • La proprietà target registra un riferimento al destinatario dell'evento.

  • La proprietà currentTarget registra un riferimento all'oggetto dell'elenco di visualizzazione che sta elaborando l'oggetto evento.

La proprietà bubbles

Se un oggetto evento partecipa alla fase di bubbling del flusso di eventi significa che l'oggetto evento viene fatto risalire dal nodo target fino allo stage. La proprietà Event.bubbles registra un valore booleano che indica se l'oggetto evento partecipa alla fase di bubbling. Dal momento che gli eventi che partecipano alla fase di bubbling partecipano anche alle fasi di cattura e target, se il valore della proprietà è true , l'oggetto evento partecipa a tutte le tre fasi. Se il valore è false , l'oggetto evento non partecipa alla fase di bubbling.

La proprietà eventPhase

Per stabilire la fase in cui si trova un oggetto evento è sufficiente analizzarne la proprietà eventPhase . La proprietà eventPhase contiene un valore intero senza segno che rappresenta una delle tre fasi del flusso di eventi. L'API Flash Player definisce una classe EventPhase separata che contiene tre costanti che corrispondono ai tre valori interi senza segno, come dimostra la seguente porzione di codice:

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

Queste costanti corrispondono ai tre valori validi della proprietà eventPhase e concorrono a rendere il codice più leggibile. Per fare in modo, ad esempio, che la funzione myFunc() sia chiamata solo se il destinatario dell'evento si trova nella fase target, potete usare il codice seguente per verificare questa condizione:

if (event.eventPhase == EventPhase.AT_TARGET) 
{ 
    myFunc(); 
}

La proprietà target

La proprietà target contiene un riferimento all'oggetto che rappresenta il destinatario dell'evento. In alcuni casi il destinatario è semplice: quando un microfono diventa attivo, il destinatario dell'evento è l'oggetto Microphone. Se il destinatario si trova nell'elenco di visualizzazione, tuttavia, è necessario considerare anche la gerarchia dell'elenco di visualizzazione. Se, ad esempio, un utente esegue un clic del mouse in un punto che comprende più oggetti dell'elenco di visualizzazione sovrapposti, Flash Player e AIR scelgono come destinatario dell'evento l'oggetto più distante dallo stage.

Nei file SWF particolarmente complessi, in particolare quelli in cui i pulsanti sono normalmente decorati con piccoli oggetti secondari, la proprietà target spesso può non essere utilizzata poiché punterebbe a un oggetto secondario e non al pulsante. Un metodo comunemente usato in questi casi consiste nell'aggiungere listener di eventi al pulsante e usare la proprietà currentTarget perché ha la particolarità di puntare al pulsante, mentre la proprietà target potrebbe puntare a un oggetto secondario del pulsante.

La proprietà currentTarget

La proprietà currentTarget contiene un riferimento all'oggetto che sta elaborando l'oggetto evento. Anche se può apparire strano non sapere quale nodo sta attualmente elaborando l'oggetto evento che si sta analizzando, considerate che potete aggiungere una funzione listener a qualsiasi oggetto di visualizzazione del flusso dell'oggetto e che la funzione listener può essere inserita in qualsiasi posizione. Inoltre, la stessa funzione listener può essere aggiunta a vari oggetti di visualizzazione. Man mano che la dimensione e la complessità di un progetto crescono, la proprietà currentTarget diventa sempre più utile.

Nozioni fondamentali sui metodi della classe Event

I metodi della classe Event possono essere suddivisi in tre categorie:

  • Metodi di utilità che creano copie di un oggetto evento o lo convertono in una stringa

  • Metodi del flusso di eventi, che rimuovono gli oggetti evento dal flusso di eventi

  • Metodi dei comportamenti predefiniti, che disattivano i comportamenti predefiniti o controllano se sono stati disattivati

Metodi di utilità della classe Event

Esistono due metodi di utilità nella classe Event. Il metodo clone() permette di creare copie di un oggetto evento, mentre il metodo toString() permette di convertire in stringa le proprietà e i relativi valori di un oggetto evento. Entrambi questi metodi vengono utilizzati internamente dal sistema di gestione degli eventi ma sono disponibili anche per gli sviluppatori.

Per gli sviluppatori esperti che creano sottoclassi della classe Event: affinché la sottoclasse della classe Event funzioni correttamente, è necessario sostituire e implementare le versioni di entrambi i metodi di utilità.

Arresto del flusso di eventi

Per interrompere il tragitto dell'oggetto evento lungo il flusso di eventi, potete chiamare il metodo Event.stopPropagation() o il metodo Event.stopImmediatePropagation() . L'unica differenza tra i due metodi è la possibilità di eseguire gli altri listener di eventi del nodo corrente:

  • Il metodo Event.stopPropagation() impedisce all'oggetto evento di passare al nodo seguente solo una volta eseguiti gli altri listener di eventi del nodo corrente.

  • Anche il metodo Event.stopImmediatePropagation() impedisce all'oggetto evento di passare al nodo seguente, ma non permette l'esecuzione degli altri listener di eventi del nodo corrente.

La chiamata a uno di questi due metodi non influisce sull'esecuzione del comportamento predefinito associato a un evento. Per impedire l'esecuzione di un comportamento predefinito, usate i metodi dei comportamenti predefiniti della classe Event.

Annullamento del comportamento predefinito di eventi

I due metodi che agiscono sulla disattivazione del comportamento predefinito sono il metodo preventDefault() e il metodo isDefaultPrevented() . Chiamate il metodo preventDefault() per annullare un comportamento predefinito associato a un evento. Per verificare se preventDefault() è già stato chiamato su un oggetto evento, chiamate il metodo isDefaultPrevented() che restituisce il valore true se il metodo è già stato chiamato oppure il valore false in caso contrario.

Il metodo preventDefault() funziona solo se il comportamento predefinito dell'evento può essere disattivato. Per accertarvi di questa possibilità, vedete la documentazione API relativa a quel tipo di evento o usare ActionScript per analizzare la proprietà cancelable dell'oggetto evento.

La disattivazione del comportamento predefinito non influisce sull'avanzamento dell'oggetto evento all'interno del flusso di eventi. Usate i metodi del flusso di eventi della classe Event per eliminare un oggetto evento dal flusso di eventi.

Sottoclassi della classe Event

Per la maggior parte degli eventi, il gruppo di proprietà comuni definite nella classe Event è sufficiente. Esistono, tuttavia, alcuni eventi le cui caratteristiche peculiari non possono essere catturate dalle proprietà della classe Event. Per questi eventi, ActionScript 3.0 definisce diverse sottoclassi della classe Event.

Ogni sottoclasse comprende proprietà supplementari e tipi di evento riservati a quella categoria di eventi. Gli eventi associati agli input del mouse, ad esempio, hanno delle caratteristiche che non possono essere catturate dalle proprietà definite nella classe Event. La classe MouseEvent rappresenta un ampliamento della classe Event e comprende dieci proprietà che contengono informazioni come la posizione dell'evento mouse e i tasti premuti durante l'evento mouse.

Una sottoclasse della classe Event contiene anche le costanti che rappresentano i tipi di evento associati alla sottoclasse. La classe MouseEvent, ad esempio, definisce costanti per vari tipi di evento mouse e comprende gli eventi del tipo click , doubleClick , mouseDown e mouseUp .

Come descritto nella sezione Metodi di utilità della classe Event del capitolo Oggetti evento , quando si crea una sottoclasse Event, per fornire delle specifiche funzionalità alla sottoclasse, è necessario ignorare i metodi clone() e toString() .