擷取鍵盤輸入



顯示物件如果從 InteractiveObject 類別繼承了物件的互動模式,則可以透過事件偵聽程式回應鍵盤事件。例如,您可以將事件偵聽程式放置在「舞台」上,以偵聽並回應鍵盤輸入。在下列程式碼中,事件偵聽程式會擷取按鍵按下動作,並顯示按鍵名稱與按鍵碼屬性:

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

某些按鍵 (例如 Ctrl 鍵) 就算按下之後不會出現文字,也會產生事件。

在上一個程式碼範例中,鍵盤事件偵聽程式擷取了整個「舞台」的鍵盤輸入。您也可以針對「舞台」上的特定顯示物件撰寫事件偵聽程式;一旦物件成為焦點就可觸發這個事件偵聽程式。

在下列範例中,只有當使用者在 TextField 實體中輸入時,「輸出」面板才會反映按鍵動作。按住 Shift 鍵則會暫時將 TextField 的邊框顏色變為紅色。

這個程式碼會假定「舞台」上有名為 tf 的 TextField 實體。

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

這個 TextField 類別也會回報 textInput 事件,您可以在使用者輸入文字時偵聽這個事件。如需詳細資訊,請參閱擷取文字輸入

瞭解按鍵碼與字元碼

您可以存取鍵盤事件的 keyCodecharCode 屬性,以判斷所按下的按鍵並隨後觸發其它動作。keyCode 屬性是一個數值,會對應至鍵盤上某個按鍵的值。charCode 屬性是目前字元集中該按鍵的數值 (預設字元集為支援 ASCII 的 UTF-8)。

按鍵碼值與字元碼值之間的主要不同之處在於,按鍵碼值表示鍵盤上的特定按鍵 (數字鍵台上的 1 與鍵盤上面那一整排數字中的 1 不同,但是產生「1」與「!」的按鍵卻是同一個),而字元值則表示特定字元 (大寫 R 和小寫 r 字元是不一樣的)。

備註: 如需按鍵與其 ASCII 字元碼值之間的對應,請參閱「ActionScript 語言參考」中的「flash.ui.Keyboard」類別。

按鍵與其按鍵碼之間的對應關係取決於裝置與作業系統。因此,請勿透過按鍵對應關係來觸發動作。相反地,請透過 Keyboard 類別所提供之預先定義的常數值,參考適當的 keyCode 屬性。例如,不要使用 Shift 鍵的按鍵對應,而改用 Keyboard.SHIFT 常數 (如上一個程式碼樣本所示)。

瞭解 KeyboardEvent 優先順序

如同其它事件一樣,鍵盤事件順序是由顯示物件階層架構所決定,而不是由程式碼中 addEventListener() 方法的指定順序所決定。

例如,假定您將名為 tf 的文字欄位置入名為 container 影片片段中,然後為按鍵事件將事件偵聽程式同時加入這兩個實體,如下列範例所示:

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 + ")"); 
}

因為文字欄位及其父容器上都有一個偵聽程式,所以每次在 TextField 中按下按鍵時,就會呼叫兩次 reportKeyDown() 函數。請注意,每次按下一個按鍵,文字欄位就會在 container 影片片段傳送事件之前,先傳送一個事件。

作業系統以及網頁瀏覽器會搶先在 Adobe Flash Player 或 AIR 之前處理鍵盤事件。例如,使用 Microsoft Internet Explorer 時,請在任何包含物件的 SWF 檔傳送鍵盤事件時,先按下 Ctrl+W 鍵,關閉瀏覽器視窗。