现在的位置: 首页 > 综合 > 正文

关 中 输 法

2011年05月25日 ⁄ 综合 ⁄ 共 4731字 ⁄ 字号 评论关闭

问题的重现过程如下:
打开输入法聊天的情况下,点击了游戏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 的詳細資訊,請參閱您在為其開發應用程式之作業系統的說明文件。如需其它資源,請參閱下列網站:

注意

 

如果使用者的電腦中未啟用 IME,則呼叫 Capabilities.hasIME 外的 IME 方法或屬性便會失敗。一旦您以手動方式啟用 IME,對於 IME 方法和屬性的後續 ActionScript 呼叫都會如預期地發揮作用。例如,假設您使用的是日文 IME,則必須在呼叫任何 IME 方法或屬性之前啟用該 IME。

副主題

檢查是否已安裝並啟用 IME

判斷目前所啟用的 IME 轉換模式

設定 IME 轉換模式

停用特定文字欄位的 IME

偵聽 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_INFocusEvent.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;
    }
}

此範例會先建立 phoneTxtnameTxt 兩個輸入文字欄位,然後再將兩個事件偵聽程式加入至 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 文字欄位中輸入的日文字串。

抱歉!评论已关闭.