Flex 3: предотвращение событий клавиатуры от Sprite - PullRequest
0 голосов
/ 09 февраля 2012

Я работаю над приложением Flex 3, реализованным в Actionscript 3 и MXML, которое включает в себя встроенный видеоплеер, который по сути является черным ящиком - я загружаю его как SWF с другого сайта по запросу, и я нене имеет доступа к его исходному коду.Однако он наследуется от Sprite.

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

Я попытался перехватить ключевые события в родительском элементе Sprite и установить tabEnabled = false, tabChildren = false,и buttonMode = false на Sprite, но, похоже, ничего не работает.Как будто Sprite получает нажатия клавиш по альтернативному пути событий.

Есть ли у кого-нибудь идеи о том, как я могу запретить игроку получать события клавиатуры или вводить события полностью?Мне хорошо, если никакие входные события не доходят до плеера, так как я реализовал свои собственные, отдельные элементы управления видео.

1 Ответ

4 голосов
/ 09 февраля 2012

Моя первая интуиция - именно то, что сказал @wvxvw. Компонент, который вы используете, вероятно, прослушивает события на уровне сцены. Я считаю, что добавление таких прослушивателей событий является ужасным нарушением принципов инкапсуляции, и похоже, что вы унаследовали проблему.

Моя попытка решить эту проблему - отменить события до того, как они выйдут на сцену. Поскольку вы пометили это как Flex, в основное приложение добавьте прослушиватели событий для keyUp и keyDown .

В прослушивателе событий просто проверьте цель; и если это не экземпляр вашего видеоплеера, то прекратить распространение .

protected function keyUpListener(event:Event):void{
 if(event.target == myVideoPlayerInstance){
   return;
 }
 event.stopPropagation();
 event.stopImmediatePropagation();
}

Предполагая, что ваше приложение не имеет каких-либо других обработчиков событий keyUp / keyDown, добавленных на этапе, этот подход должен работать (теоретически).

Если используемый вами видеокомпонент имеет события на этапе захвата, я не уверен, что вы можете что-то сделать, чтобы предотвратить это.

...