Проблема с обработкой событий клавиатуры внутри Canvas с использованием Flex - PullRequest
1 голос
/ 06 февраля 2009

По какой-то причине определяемый мной слушатель событий никогда не получает никаких событий, хотя я полагаю, что так и должно быть. Вот очень краткое описание кода MXML, который я использую:

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

Если я добавлю прослушиватель событий KEY_DOWN в WindowedApplication или корневой VBox, обработчик получит эти события очень хорошо. Но если я добавлю слушателя в Canvas или первую вкладку VBox, то обработчик никогда не получит его. (Я предполагаю, что щелчок по области холста дает ему фокус - я прав?)

Я только начинаю с Flex, поэтому надеюсь, что где-то допустил глупую ошибку новичка. Я был бы очень благодарен за любую помощь. Спасибо!

Ответы [ 2 ]

1 голос
/ 06 февраля 2009

Согласитесь с Райаном, и я бы добавил, что иногда мне было бы полезно, при обработке событий клавиатуры в целом, подключать моих слушателей к фазе capture события, а не к цели или фазы пузырьков (обратите внимание на третий аргумент, по умолчанию 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();
    }
}   

... и удерживает вас от перетаскивания слушателей клавиатуры по всему вашему приложению.

Фазы распространения события описаны более подробно здесь . Проверьте это также - там есть отличная информация, которую стоит знать.

1 голос
/ 06 февраля 2009

вы хотите узнать и поймать событие keydown, отправленное с холста? Я бы сказал, что да, у вас, вероятно, проблемы с холстом, который на самом деле имеет фокус. Эта ссылка может помочь некоторым:

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

Знание того, чего вы пытаетесь достичь, поможет вам найти лучшее решение. Почему вы хотите ловить события клавиатуры только на холсте?

...