我应该使用哪种方法来创建使用adobe flash的新键盘

时间:2015-03-26 18:20:42

标签: actionscript-3

出于教育目的,我试图以某种方式创建一个新的键盘。 我已经使用actionscript 3编写了这段代码。我创建了一个输入文本字段(命名为t1)。当用户按下键盘上的q按钮(其中有一个ASCII水印81)时,我想要打印出字母b文本字段所以我写了这段代码:

stage.addEventListener(KeyboardEvent.KEY_DOWN, pressing);

function pressing(event:KeyboardEvent):void
{
//trace(event.keyCode);
if(event.keyCode==81)
  t1.replaceSelectedText("b");
}

问题是方法replaceSelectedText在屏幕上打印两个字母(q& b)我可以使用哪种方法? 任何帮助,将不胜感激。

2 个答案:

答案 0 :(得分:0)

使用replaceSelectedText方法时,首先需要选择要替换的文本。这可以通过" setSelection"方法。这来自adobe帮助网站:

setSelection(beginIndex:int, endIndex:int):void

"将由firstIndex和endIndex参数指定的第一个和最后一个字符的索引值指定的文本设置为选择。"

目前,由于您没有选择任何文字,它似乎只是添加了文字" b"因为它没有取代任何东西。因此,您应该先尝试选择" q"。

或者,您可以使用其他方法。来自adobe帮助网站:

replaceText(beginIndex:int, endIndex:int, newText:String):void    

"将beginIndex和endIndex参数指定的字符范围替换为newText参数的内容。"

这会减少一行额外的代码。

我自己实际上并没有这样做,所以如果这不起作用,请点击文本字段的adobe帮助页面链接:http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/text/TextField.html

答案 1 :(得分:0)

我认为要做你想要的事情(在键入时更换一个字符),KeyboardEvent.KEY_DOWN是不够的,因为当该事件被触发时,文本尚未更改,因此,您在其处理程序中对文本字段所做的任何更改都不会取消插入当前键入的char。此外,使用KeyboardEvent.KEY_UP(除KeyboardEvent.KEY_DOWN之外)无法解决问题,因为您可以n次事件触发KeyboardEvent.KEY_DOWN事件并触发KeyboardEvent.KEY_UP事件一次!

所以,我认为可以完成这项工作的最佳事件是每次更改文本字段文本时触发的Event.CHANGE事件,因此您可以这样做:

// is there a char to replace ?
var replace_char:Boolean = false;

// the position of the char that we want to replace
var char_position:int = -1;

var text_input:TextField = new TextField();
    text_input.type = 'input';
    text_input.border = true;

    text_input.addEventListener(Event.CHANGE, onTextChange);
    function onTextChange(e:Event):void {
        if(replace_char && char_position >= 0){
            text_input.replaceText(char_position, char_position + 1, 'b');
            replace_char = false;
        }
    }
addChild(text_input);

stage.addEventListener(KeyboardEvent.KEY_DOWN, _onKeyDown);
function _onKeyDown(e:KeyboardEvent):void {
    if(e.keyCode == 81) {
        replace_char = true;
        char_position = text_input.selectionBeginIndex; 
    }
}

编辑:

要使用密钥及其等价物列表,您可以使用对象来存储密钥,如下所示:

// list of all keys (chars) and their equivalents
var chars:Object = {
    81: 'b',    // q => b
    83: 'v',    // s => v
    68: 'c'     // d => c

    // other chars

}

var char_to_replace:int = -1;

// other instructions

function onTextChange(e:Event):void {
    if(replace_char && char_position >= 0 && char_to_replace >= 0){
        // get the equivalent of the pressed key from chars object using : chars[key_pressed]
        text_input.replaceText(char_position, char_position + 1, chars[char_to_replace]);
        replace_char = false;
    }
}

// other instructions   

function _onKeyDown(e:KeyboardEvent):void {
    if(chars[e.keyCode]) {
        replace_char = true;
        // save the last pressed key to get its equivalent, or save this last one directly, to replace it next
        char_to_replace = e.keyCode;
        char_position = text_input.selectionBeginIndex; 
    }
}

希望可以提供帮助。