AS3键盘事件直到我点击屏幕按钮后才触发

时间:2011-04-22 18:58:25

标签: flash actionscript-3

所以这是我的设置:

我的文档类是Main.as(它扩展了MovieClip)。以下代码在我的Main.as中。

我在我的类定义中声明了所有这些变量:

private var holder:MovieClip;
private var leftButton:SimpleButton;
private var rightButton:SimpleButton;

在构造函数中......

holder = new MovieClip();
addChild(holder);
holder.addEventListener(KeyboardEvent.KEY_UP, handleKeyboardEvent);

leftButton = new Arrow();
rightButton = new Arrow();

holder.addChild(leftButton);
holder.addChild(rightButton);

leftButton.x = 50;
leftButton.rotation = 180;
rightButton.x = 150;

leftButton.y = rightButton.y = 50;

leftButton.addEventListener(MouseEvent.CLICK, handlePaging);
rightButton.addEventListener(MouseEvent.CLICK, handlePaging);

......在构造函数之外...

public function handleKeyboardEvent ( e:KeyboardEvent ) {
            trace("got a keyboard event");

                trace("e.charCode : " + e.charCode);
                trace("e.keyCode : " + e.keyCode);
                switch (e.keyCode) {
                    case 37: //left arrow
                        showPreviousMoment();
                        break;
                    case 39: //right arrow
                        showNextMoment();
                        break;
                }


        }

这两个按钮是我在库中的Arrow动画片段的实例。 Arrow影片剪辑中只包含图形(在其属性对话框中,基类为flash.display.SimpleButton)。

我希望用户能够按屏幕上的箭头或键盘箭头键向前和向后翻页。

所以...当我测试电影或将其发布为应用时,按左右键盘键不会做任何事情。然而......在我点击屏幕箭头之后,键盘事件就被拿起了!为什么我的键盘事件最初没有收到?为什么单击屏幕上的按钮会使“持有者”开始接收事件?

更新

我还注释了我的所有代码EXCEPT,用于实例化'holder'并添加监听器。 持有人没有听到KeyboardEvents。

UPDATE ...应答

所以我发现如果我想全局听到KeyboardEvent,我应该将stage注册为监听器。所以这就是诀窍:

stage.addEventListener(KeyboardEvent.KEY_UP, handleKeyboardEvent);

Colin Moock的书中的信息:

  

触发的键盘输入事件   应用程序范围的命令   通常由全球处理   用Flash注册的听众   玩家的舞台实例。相比之下,   键盘输入事件触发一个   特定的界面元素响应   通常由听众处理   注册的对象是   目前有键盘焦点。

所以我想在我的初始版本中,当我点击屏幕上的箭头按钮时,我以某种方式将键盘焦点放在'持有者;。

3 个答案:

答案 0 :(得分:4)

通常,您点击的对象会获得焦点。这确实会影响听众,这就是为什么当你将它添加到舞台时它的工作原理。

当您点击其中任何一个时,您的“持有者”对象得到了焦点,因此事件被触发。现在你做得很好,你把它添加到舞台上。

答案 1 :(得分:2)

更动态的解决方案(例如,如果动态实例化包含movieclip的类)将使用:

stage.focus = this;

因此,如果您将事件侦听器应用于实际需要侦听键事件的类实例,那么这可能对您更有效。

对我来说,之前的建议不起作用,因为我在运行时添加了我的主类实例。最后,我的代码看起来像这样:

Main.singletron.stage.addEventListener(KeyboardEvent.KEY_UP, checkKeyDown);
Main.singletron.stage.focus = this;

......你必须为这两条线路设置一个单通道。

答案 2 :(得分:0)

我根据@Ascension Systems的推荐发布了我自己的问题的答案。我只是真的从我的更新复制到上面的问题。

<强> UPDATE ...应答

所以我发现如果我想全局听到KeyboardEvent,我应该将stage注册为监听器。所以这就是诀窍:

stage.addEventListener(KeyboardEvent.KEY_UP, handleKeyboardEvent);

Colin Moock的书中的信息:

  

触发的键盘输入事件   应用程序范围的命令   通常由全球处理   用Flash注册的听众   玩家的舞台实例。相比之下,   键盘输入事件触发一个   特定的界面元素响应   通常由听众处理   注册的对象是   目前有键盘焦点。

所以我想在我的初始版本中,当我点击屏幕上的箭头按钮时,我以某种方式将键盘焦点放在'持有者'上。