捕获Sprite键盘输入的问题

时间:2011-06-02 14:49:31

标签: flash flex addeventlistener

我试图在我的UI上捕获方形区域的键盘和鼠标事件,由Sprite表示。鼠标捕获工作,键盘捕获根本不起作用:

private var square:Sprite = new Sprite();
square.graphics.beginFill(0x000000, 1);
square.graphics.drawRect(0, 0, 1024, 720);
square.graphics.endFill(); 
square.buttonMode = true; 
...
square.addEventListener(KeyboardEvent.KEY_DOWN,reportKeyDown);

private function reportKeyDown(event:KeyboardEvent):void 
{
trace("==>reportKeyDown: " + String.fromCharCode(event.charCode) + " (key code: " + 
event.keyCode + " character code: " +         event.charCode + ")");
}

我从未看到执行reportKeyDown,即使Sprite对象有焦点。 知道问题是什么吗? 谢谢, -V

2 个答案:

答案 0 :(得分:1)

我最近回答了similar question。正如Flextras所提到的,通常不接受键盘输入的控件不会调度键盘事件。

正如J_A_X所提到的,可以将eventListener添加到KeyboardEvent.KEY_DOWN事件的顶级应用程序中,然后检查其中的组合键。来自this article

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
 layout="absolute" creationComplete="init()">
 <mx:Script>
 <![CDATA[
    private function init():void{
     this.addEventListener(MouseEvent.CLICK, clickHandler);
     this.addEventListener(KeyboardEvent.KEY_DOWN,keyPressed);
    }
    private function clickHandler(event:MouseEvent):void {
      stage.focus = this;
    }
    private function keyPressed(evt:KeyboardEvent):void{
       if(evt.ctrlKey && evt.keyCode == 65)
             trace("CTRL A is pressed");
       if(evt.ctrlKey && evt.keyCode == 66)
             trace("CTRL B is pressed");
   }
 ]]>
 </mx:Script>
</mx:Application>

答案 1 :(得分:0)

仅从接受用户输入的控件(例如TextInput)调度键盘事件。这在文档中有点混乱;因为事件列在大多数Flex组件上。你的方法看起来正确,你只需要Sprite内部的东西来调度那些键盘事件。