擷取鍵盤輸入Flash Player 9 以及更新的版本,Adobe AIR 1.0 以及更新的版本 顯示物件如果從 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 事件,您可以在使用者輸入文字時偵聽這個事件。如需詳細資訊,請參閱擷取文字輸入。 備註: 在 AIR 執行階段,可以取消鍵盤事件。在 Flash Player 執行階段,則無法取消鍵盤事件。
按鍵碼與字元碼您可以存取鍵盤事件的 keyCode 和 charCode 屬性,以判斷所按下的按鍵並隨後觸發其它動作。keyCode 屬性是一個數值,會對應至鍵盤上某個按鍵的值。charCode 屬性是目前字元集中該按鍵的數值 (預設字元集為支援 ASCII 的 UTF-8)。 按鍵碼值與字元碼值之間的主要不同之處在於,按鍵碼值表示鍵盤上的特定按鍵 (數字鍵台上的 1 與鍵盤上面那一整排數字中的 1 不同,但是產生「1」與「!」的按鍵卻是同一個),而字元值則表示特定字元 (大寫 R 和小寫 r 字元是不一樣的)。 備註: 如需按鍵與 ASCII 字元碼值之間的對應關係,請參閱適用於 Adobe Flash Platform 的 ActionScript 3.0 參考中的 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 鍵,關閉瀏覽器視窗。 |
|