使用Flex处理Canvas中的键盘事件的问题

时间:2009-02-06 02:01:17

标签: flex events actionscript keyboard mxml

由于某种原因,我定义的事件监听器似乎永远不会收到任何事件,尽管我相信它应该。这是我正在使用的MXML代码的简短描述:

WindowedApplication
    VBox (root box)
        MenuBar
        TabNavigator
            VBox (first tab)
                Canvas
            VBox (second tab)

如果我将KEY_DOWN事件的监听器添加到WindowedApplication或根VBox,处理程序就会很好地接收事件。但是,如果我将侦听器添加到Canvas或第一个选项卡VBox,处理程序似乎永远不会收到任何。 (我在这里假设只需单击“画布”区域就会聚焦 - 我是否正确?)

我刚刚开始使用Flex,所以我希望我在某个地方犯了一个愚蠢的初学者的错误。我会非常感谢任何帮助。谢谢!

2 个答案:

答案 0 :(得分:1)

你想知道并抓住从画布发送的keydown事件?我会说是的,你可能在画布实际上有焦点时遇到了麻烦。这个链接可以帮助一些:

http://livedocs.adobe.com/flex/3/html/help.html?content=Capturing_User_Input_3.html

了解您正在努力实现的目标将有助于为您提供更好的解决方案。为什么你只想在画布上捕捉键盘事件?

答案 1 :(得分:1)

同意Ryan,我补充一点,我有时会发现它在处理键盘事件时很有用,可以将听众连接到事件的捕获阶段,而不是目标或冒泡阶段(注意第三个参数,默认为false):

stage.addEventListener(KeyboardEvent.KEY_DOWN, handleKeyDown, true);

考虑休闲游戏的例子,其中箭头键以某种方式控制核心动作(俄罗斯方块,可能 - 向左旋转,向右旋转),在捕捉阶段期间响应事件意味着可以具有明显的优势。来自文档:

  

在捕获阶段,Flex会检查   显示器中的事件祖先   列表以查看哪些已注册   作为活动的倾听者。柔性   从根祖先开始   继续沿显示列表向下移动   直接祖先的目标。多数情况   案例,根祖先是   阶段,然后是SystemManager,和   然后是Application对象。

因此,在这种情况下,您可以确定舞台的侦听器将首先获得通知,然后再通过其他任何人获得通知 - 并通过完全终止事件传播(有时您可能想要这样做)或通过将其转换为更具特定应用程序的自定义事件:

private function handleKeyDown(event:KeyboardEvent):void
{
    if (event.keyCode == Keyboard.LEFT)
    {
        dispatchEvent(new Event("rotateLeft"));
    }
    else if (event.keyCode == Keyboard.RIGHT)
    {
        dispatchEvent(new Event("rotateRight"));
    }
    else
    {
        event.stopPropagation();
    }
}   

...让您远离应用程序中的键盘监听器。

事件传播阶段为described in more detail here。检查一下 - 那里有很好的信息非常值得了解。