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).
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.