关 中 输 法
2010-04-10 15:04 宝宝合凤凰 阅读(459) 评论(0) 编辑 收藏 举报使用 IME 類別 | |||
问题的重现过程如下:
打开输入法聊天的情况下,点击了游戏NPC对话打开NPC对话框。在没有关闭输入法的情况下,选择一个键盘小游戏。此时游戏中的键盘上下左右侦听会失效。
遇到这种情况我们可以利用AS3的一个输入法控制的类——IME,在打开小游戏的时候自动关闭输入法。
IME类很简单,记住两个属性就行了。
属性:IME.enabled 当输入法打开时值为true 设置为false将关闭输入法。
属性:IME.conversionMode 大陆地区默认值通常为"CHINESE",设置值为ALPHANUMERIC_HALF可以进入半角输入状态
使用 IME 類別
IME 類別可讓您在 Flash Player 中操作作業系統的 IME。
您可以使用 ActionScript 判斷下列資訊:
- 使用者的電腦中是否有安裝 IME (
Capabilities.hasIME
) - 使用者的電腦目前啟用或停用 IME (
IME.enabled
) - 目前 IME 所使用的轉換模式 (
IME.conversionMode
)
您可以將輸入文字欄位與特定的 IME 內容產生關聯。當您在多個輸入欄位之間進行切換時,也可以將 IME 切換為平假名 (日文)、全形數字、半形數字和直接數入等等。
IME 可讓使用者以多位元組的語言 (例如中文、日文及韓文) 輸入非 ASCII 的文字字元。
如需有關使用 IME 的詳細資訊,請參閱您在為其開發應用程式之作業系統的說明文件。如需其它資源,請參閱下列網站:
- http://www.microsoft.com/globaldev/default.mspx
- http://developer.apple.com/documentation/
- http://java.sun.com/
注意 |
|
如果使用者的電腦中未啟用 IME,則呼叫 |
副主題
檢查是否已安裝並啟用 IME
在您呼叫任何 IME 方法或屬性之前,請務必檢查使用者的電腦中是否已安裝並啟用該 IME。下列程式碼會說明如何在呼叫任何方法之前,檢查使用者是否已安裝並啟動 IME:
if (Capabilities.hasIME) { if (IME.enabled) { trace("IME 已安裝且啟用。"); } else { trace("IME 已安裝,但尚未啟用。請啟用您的 IME 並再試一次。"); } } else { trace("IME 尚未安裝。請安裝一項 IME 並再試一次。"); }
上一段程式碼會先使用 Capabilities.hasIME
屬性,檢查使用者是否已安裝 IME。如果將此屬性設定為 true
,程式碼接著就會使用 IME.enabled
屬性,檢查使用者目前是否已啟用該 IME。
判斷目前所啟用的 IME 轉換模式
建置多國語言應用程式時,您可能需要判斷使用者目前啟動的轉換模式。下列程式碼會說明如何檢查使用者是否已安裝 IME,以及如果已經安裝,那麼目前啟動的 IME 轉換模式為何:
if (Capabilities.hasIME) { switch (IME.conversionMode) { case IMEConversionMode.ALPHANUMERIC_FULL: tf.text = "目前的轉換模式為全形英數模式。"; break; case IMEConversionMode.ALPHANUMERIC_HALF: tf.text = "目前的轉換模式為半形英數模式。"; break; case IMEConversionMode.CHINESE: tf.text = "目前的轉換模式為中文模式。"; break; case IMEConversionMode.JAPANESE_HIRAGANA: tf.text = "目前的轉換模式為日文平假名模式。"; break; case IMEConversionMode.JAPANESE_KATAKANA_FULL: tf.text = "目前的轉換模式為日文全形片假名模式。"; break; case IMEConversionMode.JAPANESE_KATAKANA_HALF: tf.text = "目前的轉換模式為日文半形片假名模式。"; break; case IMEConversionMode.KOREAN: tf.text = "目前的轉換模式為韓文模式。"; break; default: tf.text = "目前的轉換模式為 " + IME.conversionMode + "."; break; } } else { tf.text = "請安裝 IME 並再試一次。"; }
上一段程式碼會先檢查使用者是否已安裝 IME。然後再藉由比較 IME.conversionMode
屬性與 IMEConversionMode 類別中的每一個常數,檢查目前使用的 IME 轉換模式為何。
設定 IME 轉換模式
當您變更使用者的 IME 轉換模式時,必須確定該段程式碼是位於 try..catch
區段中,因為如果 IME 無法設定轉換模式時,使用 conversionMode
屬性來設定轉換模式便會擲回錯誤。下列程式碼說明在設定 IME.conversionMode
屬性時,try..catch
區塊的使用方式:
var statusText:TextField = new TextField; statusText.autoSize = TextFieldAutoSize.LEFT; addChild(statusText); if (Capabilities.hasIME) { try { IME.enabled = true; IME.conversionMode = IMEConversionMode.KOREAN; statusText.text = "轉換模式為 " + IME.conversionMode + "."; } catch (error:Error) { statusText.text = "無法設定轉換模式。\n" + error.message; } }
上一段程式碼會先建立文字欄位,以便用來向使用者顯示狀態訊息。接著,如果已安裝 IME,則此程式碼會啟用 IME 並將轉換模式設定為韓文。如果使用者的電腦中沒有安裝韓文 IME,Flash Player 就會擲回錯誤,而且 try..catch
區塊便會捕捉到此錯誤。try..catch
區塊接著會在先前建立的文字欄位中顯示該錯誤訊息。
停用特定文字欄位的 IME
在某些情況下,您可能會在使用者輸入字元期間,希望停用使用者的 IME。例如,假設某個文字欄位只接受數值輸入,您可能就不希望 IME 出現並拖慢資料輸入的速度。
下列範例會說明如何偵聽 FocusEvent.FOCUS_IN
和 FocusEvent.FOCUS_OUT
事件,並據以停用使用者的 IME:
var phoneTxt:TextField = new TextField(); var nameTxt:TextField = new TextField(); phoneTxt.type = TextFieldType.INPUT; phoneTxt.addEventListener(FocusEvent.FOCUS_IN, focusInHandler); phoneTxt.addEventListener(FocusEvent.FOCUS_OUT, focusOutHandler); phoneTxt.restrict = "0-9"; phoneTxt.width = 100; phoneTxt.height = 18; phoneTxt.background = true; phoneTxt.border = true; addChild(phoneTxt); nameField.type = TextFieldType.INPUT; nameField.x = 120; nameField.width = 100; nameField.height = 18; nameField.background = true; nameField.border = true; addChild(nameField); function focusInHandler(event:FocusEvent):void { if (Capabilities.hasIME) { IME.enabled = false; } } function focusOutHandler(event:FocusEvent):void { if (Capabilities.hasIME) { IME.enabled = true; } }
此範例會先建立 phoneTxt
和 nameTxt
兩個輸入文字欄位,然後再將兩個事件偵聽程式加入至 phoneTxt
文字欄位。當使用者將焦點設定為 phoneTxt
文字欄位時,就會傳送 FocusEvent.FOCUS_IN
事件並停用 IME。當 phoneTxt
文字欄位失去焦點時,則會傳送 FocusEvent.FOCUS_OUT
事件並重新啟用 IME。
偵聽 IME 組成事件
當設定組成字串時,就會傳送 IME 組成事件。例如,假設使用者已啟用並啟動他們的 IME,然後以日文輸入字串,則一旦使用者選取該組成字串,就會傳送 IMEEvent.IME_COMPOSITION
事件。為了偵聽 IMEEvent.IME_COMPOSITION
事件,您必須將事件偵聽程式加入至 System 類別中的靜態 ime
屬性 (flash.system.System.ime.addEventListener(...)
),如下所示:
var inputTxt:TextField; var outputTxt:TextField; inputTxt = new TextField(); inputTxt.type = TextFieldType.INPUT; inputTxt.width = 200; inputTxt.height = 18; inputTxt.border = true; inputTxt.background = true; addChild(inputTxt); outputTxt = new TextField(); outputTxt.autoSize = TextFieldAutoSize.LEFT; outputTxt.y = 20; addChild(outputTxt); if (Capabilities.hasIME) { IME.enabled = true; try { IME.conversionMode = IMEConversionMode.JAPANESE_HIRAGANA; } catch (error:Error) { outputTxt.text = "Unable to change IME."; } System.ime.addEventListener(IMEEvent.IME_COMPOSITION, imeCompositionHandler); } else { outputTxt.text = "請安裝 IME 並再試一次。"; } function imeCompositionHandler(event:IMEEvent):void { outputTxt.text = "您輸入了: " + event.text; }
上一段程式碼會建立兩個文字欄位,並將之加入至顯示清單中。第一個文字欄位 inputTxt
是可讓使用者輸入日文文字的輸入文字欄位,第二個文字欄位 outputTxt
是動態文字欄位,可讓使用者看到錯誤訊息,或回送使用者在 inputTxt
文字欄位中輸入的日文字串。