使用 IME 类

Flash Player 9 和更高版本,Adobe AIR 1.0 和更高版本

通过使用 IME 类,您可以在 Flash Player 或 Adobe AIR 中运用操作系统的 IME。

使用 ActionScript 可以确定以下内容:

  • 用户的计算机上是否安装了 IME (Capabilities.hasIME)

  • 用户计算机上是否启用了 IME (IME.enabled)

  • 当前 IME 使用的转换模式 (IME.conversionMode)

可以使用特定 IME 上下文关联输入文本字段。在输入字段之间切换时,还可以在平假名(日文)、全角数字、半角数字、直接输入等之间切换 IME。

利用 IME,用户可键入多字节语言(例如中文、日文和韩文)的非 ASCII 文本字符。

有关使用 IME 的详细信息,请参阅要为其开发应用程序的操作系统的文档。要获取其他资源,请参阅以下 Web 站点:

注: 如果用户计算机上 IME 未处于活动状态,则对 IME 方法或属性(除 Capabilities.hasIME 之外)的调用将会失败。 一旦手动激活 IME,随后对 IME 方法和属性的 ActionScript 调用即会正常运行。例如,如果使用日文 IME,则必须在调用任何 IME 方法或属性之前将它激活。

查看是否已安装并启用了 IME

调用任何 IME 方法或属性之前,总应检查用户计算机上当前是否已安装并启用 IME。以下代码说明了在调用任何方法之前如何检查用户是否安装并启用了 IME:

if (Capabilities.hasIME) 
{ 
    if (IME.enabled) 
    { 
        trace("IME is installed and enabled."); 
    } 
    else 
    { 
        trace("IME is installed but not enabled. Please enable your IME and try again."); 
    } 
} 
else 
{ 
    trace("IME is not installed. Please install an IME and try again."); 
}

上面的代码首先使用 Capabilities.hasIME 属性检查用户是否安装了 IME。如果此属性设置为 true,则代码使用 IME.enabled 属性检查当前是否启用了用户的 IME。

确定当前启用的是哪种 IME 转换模式

构建多语言应用程序时,您可能需要确定用户当前启用的是哪种 IME 转换模式。以下代码说明了如何检查用户是否安装了 IME,以及在安装 IME 的情况下当前启用的是哪种 IME 转换模式:

if (Capabilities.hasIME) 
{ 
    switch (IME.conversionMode) 
    { 
        case IMEConversionMode.ALPHANUMERIC_FULL: 
            tf.text = "Current conversion mode is alphanumeric (full-width)."; 
            break; 
        case IMEConversionMode.ALPHANUMERIC_HALF: 
            tf.text = "Current conversion mode is alphanumeric (half-width)."; 
            break; 
        case IMEConversionMode.CHINESE: 
            tf.text = "Current conversion mode is Chinese."; 
            break; 
        case IMEConversionMode.JAPANESE_HIRAGANA: 
            tf.text = "Current conversion mode is Japananese Hiragana."; 
            break; 
        case IMEConversionMode.JAPANESE_KATAKANA_FULL: 
            tf.text = "Current conversion mode is Japanese Katakana (full-width)."; 
            break; 
        case IMEConversionMode.JAPANESE_KATAKANA_HALF: 
            tf.text = "Current conversion mode is Japanese Katakana (half-width)."; 
            break; 
        case IMEConversionMode.KOREAN: 
            tf.text = "Current conversion mode is Korean."; 
            break; 
        default: 
            tf.text = "Current conversion mode is " + IME.conversionMode + "."; 
            break; 
    } 
} 
else 
{ 
    tf.text = "Please install an IME and try again."; 
}

上面的代码首先检查用户是否安装了 IME。接下来,该代码通过将 IME.conversionMode 属性与 IMEConversionMode 类中的每个常量进行比较,检查当前 IME 使用的是哪种转换模式。

设置 IME 转换模式

更改用户的 IME 的转换模式时,您需要确保将代码封装在 try..catch 块中,因为使用 conversionMode 属性设置转换模式时,如果 IME 无法设置该转换模式,则可能会引发错误。下面的代码演示如何使用 try..catch 块(在设置 IME.conversionMode 属性时):

var statusText:TextField = new TextField; 
statusText.autoSize = TextFieldAutoSize.LEFT; 
addChild(statusText); 
if (Capabilities.hasIME) 
{ 
    try 
    { 
        IME.enabled = true; 
        IME.conversionMode = IMEConversionMode.KOREAN; 
        statusText.text = "Conversion mode is " + IME.conversionMode + "."; 
    } 
    catch (error:Error) 
    { 
        statusText.text = "Unable to set conversion mode.\n" + error.message; 
    } 
}

上面的代码先创建一个文本字段,该字段用于向用户显示状态消息。接下来,如果已安装 IME,该代码会启用 IME 并将转换模式设置为“韩文”。如果用户计算机上未安装韩文 IME,则 Flash Player 或 AIR 将引发错误,该错误由 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 = "Please install IME and try again."; 
} 
 
function imeCompositionHandler(event:IMEEvent):void 
{ 
    outputTxt.text = "you typed: " + event.text; 
}

上面的代码创建两个文本字段,并将其添加到显示列表中。第一个文本字段 inputTxt 是一个输入文本字段,用户可以在其中输入日文文本。第二个文本字段 outputTxt 是一个动态文本字段,用于向用户显示错误消息,或回显用户在 inputTxt 文本字段中键入的日文字符串。