2012/03/02

擴充、修改 flash.ui.Keyboard

flash.ui.Keyboard裡定義了很多常數
但是如果定義的值不夠用,或是值不是我們需要的怎麼辦?

當然可以自己另外定義一組Class專門給特殊的值或新增的值叫用。

不過這樣flash.ui.Keyboard及我們自己定義的Keyboard都會同時使用,
多少會感覺混亂。

雖然可以將需要的Key值全部都重新定義到自訂的Keyboard裡,
但一方面費時費工,一方面失去程式盡量重用的精神。
flash.ui.Keyboard不能被繼承更不能覆寫,
所以只能另覓途徑。

這裡提供一個可行的方法~



首先定義一個Class放我們需要新增或是覆寫的Key值
package 
{
 /**
  * CustomizeKeyboard
  * @author HT
  */
 public class CustomizeKeyboard
 {
  public static const ENTER:uint = 9998; //flash.ui.Keyboard裡ENTER的值是13
  public static const OTHER:uint = 9999; //另外定義的值
 }
 
}


再來定義一個Class用來管控該用那個Keyboard
package 
{
 import flash.ui.Keyboard;
 import flash.utils.Proxy; //在 Flash 11 和 AIR 3.0,Proxy 類別是最上層的類別。
 import flash.utils.flash_proxy;
 
 /**
  * CustKeyboardControl
  * @author HT
  */
 
 //一定要用動態類別(dynamic)
 public dynamic class CustKeyboardControl extends Proxy 
 {
  public function CustKeyboardControl() {
   
  }
  
  override flash_proxy function getProperty(name:*):* {
   return CustomizeKeyboard[name] || Keyboard[name];
  }
  
 }
 
}

CustKeyboardControl主要只是Proxy的一個簡單應用。

當要使用時,只要先實體化CustKeyboardControl,其餘用法就跟flash.ui.Keyboard一樣。
var custKeyboard:CustKeyboardControl = new CustKeyboardControl();
trace(custKeyboard.ENTER); //9998
trace(Keyboard.ENTER);  //13
trace(custKeyboard.OTHER); //9999
trace(Keyboard.OTHER);  //會報錯,Keyboard裡並沒有OTHER這個屬性
//如果custKeyboard去存取一個flash.ui.Keyboard及CustomizeKeyboard都未定義屬性,不會報錯,會傳回undefined
trace(custKeyboard.OTHER_2); //undefined
//如果custKeyboard去存取一個CustomizeKeyboard未定義屬性但存在於flash.ui.Keyboard,會回傳flash.ui.Keyboard的值
trace(custKeyboard.RIGHT); //39

沒有留言:

張貼留言