所以这是我的设置:
我的文档类是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注册的听众 玩家的舞台实例。相比之下, 键盘输入事件触发一个 特定的界面元素响应 通常由听众处理 注册的对象是 目前有键盘焦点。
所以我想在我的初始版本中,当我点击屏幕上的箭头按钮时,我以某种方式将键盘焦点放在'持有者;。
答案 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注册的听众 玩家的舞台实例。相比之下, 键盘输入事件触发一个 特定的界面元素响应 通常由听众处理 注册的对象是 目前有键盘焦点。
所以我想在我的初始版本中,当我点击屏幕上的箭头按钮时,我以某种方式将键盘焦点放在'持有者'上。