Przechwytywanie naciśnięć klawiszyFlash 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ówWł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ń KeyboardEventPodobnie 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. |
|