Przechwytywanie naciśnięć klawiszy

Flash Player 9 i nowsze wersje, Adobe AIR 1.0 i nowsze wersje

Obiekty wyświetlane, które dziedziczą swój model interakcji z klasy InteractiveObject, mogą reagować na zdarzenia wysyłane z klawiatury dzięki detektorom zdarzeń. Na przykład, możemy umieścić na stole montażowy detektor wykrywający zdarzenia polegające na wprowadzaniu danych z klawiatury. W poniższym kodzie detektor zdarzeń przechwytuje naciśnięcie klawisza i wyświetla nazwę klawisza oraz jego kod:

function reportKeyDown(event:KeyboardEvent):void 
{ 
    trace("Key Pressed: " + String.fromCharCode(event.charCode) +         " (character code: " + event.charCode + ")"); 
} 
stage.addEventListener(KeyboardEvent.KEY_DOWN, reportKeyDown);

Niektóre klawisze, np. klawisz Ctrl, generują zdarzenia mimo że nie mają widocznej reprezentacji w postaci glifu.

W poprzednim przykładzie detektor zdarzeń przechwytywał interakcje z klawiaturą kierowane do całego stołu montażowego. Możemy także napisać detektor zdarzeń dla konkretnego obiektu wyświetlanego na stole montażowym; ten detektor będzie aktywowany, gdy obiekt stanie się aktywny.

W poniższym przykładzie naciśnięcia klawiszy są kopiowane do panelu Wyjście tylko wówczas, gdy użytkownik naciska klawisze wewnątrz instancji TextField. Przytrzymanie klawisza Shift powoduje tymczasową zmianę koloru ramki pola tekstowego na czerwony.

W przykładowym kodzie przyjęto założenie, że na stole montażowym istnieje instancja klasy TextField o nazwie tf .

tf.border = true; 
tf.type = "input"; 
tf.addEventListener(KeyboardEvent.KEY_DOWN,reportKeyDown); 
tf.addEventListener(KeyboardEvent.KEY_UP,reportKeyUp); 
 
function reportKeyDown(event:KeyboardEvent):void 
{ 
    trace("Key Pressed: " + String.fromCharCode(event.charCode) +         " (key code: " + event.keyCode + " character code: "         + event.charCode + ")"); 
    if (event.keyCode == Keyboard.SHIFT) tf.borderColor = 0xFF0000; 
} 
 
function reportKeyUp(event:KeyboardEvent):void 
{ 
    trace("Key Released: " + String.fromCharCode(event.charCode) +         " (key code: " + event.keyCode + " character code: " +         event.charCode + ")"); 
    if (event.keyCode == Keyboard.SHIFT) 
    { 
        tf.borderColor = 0x000000; 
    } 
}

Klasa TextField zgłasza także zdarzenie textInput , które pozwala reagować na wprowadzanie tekstu przez użytkownika. Więcej informacji zawiera sekcja Przechwytywanie tekstu wprowadzanego przez użytkownika .

Uwaga: W środowisku wykonawczym AIR zdarzenia pochodzące z klawiatury mogą być anulowane. W środowisku wykonawczym Flash Player zdarzenia pochodzące z klawiatury nie mogą być anulowane.

Kody klawiszy i kody znaków

Właściwości keyCode i charCode zdarzenia pochodzącego z klawiatury umożliwiają stwierdzenie, który klawisz został naciśnięty, i wywołanie odpowiednich operacji. Właściwość keyCode zawiera wartość liczbową odpowiadającą numerowi klawisza na klawiaturze. Właściwość charCode zawiera wartość liczbową kodu znaku tego klawisza z bieżącego zestawu znaków. (Domyślny zestaw znaków to UTF-8, którego podzbiorem jest zestaw ASCII).

Główna różnica między kodem klawisza a kodem znaku polega na tym, że kod klawisza jest przypisany do konkretnego klawisza fizycznego (czyli klawisz 1 na klawiaturze numerycznej ma inny kod niż klawisz 1 w górnym rzędzie, ale klawisz generujący znak „1” może także wygenerować znak „!”), natomiast kod znaku jest przypisany do konkretnego znaku (znaki R i r są traktowane jako różne).

Uwaga: Odwzorowania pomiędzy klawiszami i odpowiadającymi im kodami znaków ASCII zamieszczono w omówieniu klasy flash.ui.Keyboard w Skorowidzu języka ActionScript 3.0 dla platformy Adobe Flash .

Odwzorowania między klawiszami a kodami zależą od urządzenia i systemu operacyjnego. Dlatego nie należy używać liczbowych kodów klawiszy do inicjowania operacji. Zamiast nich należy używać wartości stałych zdefiniowanych w klasie Keyboard, aby odwoływać się do odpowiednich właściwości keyCode . Na przykład, zamiast używać kodu klawisza Shift, należy użyć stałej Keyboard.SHIFT (co zilustrowano w poprzednim przykładzie).

Priorytet przetwarzania zdarzeń KeyboardEvent

Podobnie jak inne zdarzenia, zdarzenia generowane przez klawiaturę wysyłane są w określonej kolejności uzależnionej od hierarchii obiektów wyświetlanych, a nie od kolejności wywoływania metody addEventListener() rejestrującej kolejne detektory zdarzeń.

Załóżmy na przykład, że umieściliśmy pole tekstowe tf w klipie filmowym o nazwie container i do obu tych instancji dodaliśmy detektory zdarzeń z klawiatury, co ilustruje poniższy przykład:

container.addEventListener(KeyboardEvent.KEY_DOWN,reportKeyDown); 
container.tf.border = true; 
container.tf.type = "input"; 
container.tf.addEventListener(KeyboardEvent.KEY_DOWN,reportKeyDown); 
 
function reportKeyDown(event:KeyboardEvent):void 
{ 
    trace(event.currentTarget.name + " hears key press: " +         String.fromCharCode(event.charCode) + " (key code: " +         event.keyCode + " character code: " + event.charCode + ")"); 
}

Ponieważ zarówno pole tekstowe, jak i jego kontener mają własne detektory zdarzeń, funkcja reportKeyDown() jest wywoływana dwa razy przy każdym naciśnięciu klawisza w polu tekstowym. Należy zwrócić uwagę, że przy każdym naciśnięciu klawisza pole tekstowe wywołuje zdarzenie zanim analogiczne zdarzenie wywoła klip filmowy container .

System operacyjny i przeglądarka sieci Web przetwarzają zdarzenia z klawiatury zanim trafią one do programu Flash Player lub środowiska AIR. Na przykład w programie Microsoft Internet Explorer naciśnięcie kombinacji Ctrl+W spowoduje zamknięcie okna przeglądarki zanim jakikolwiek zawarty w nim plik SWF zdąży wywołać zdarzenie.