Два события KeyboardEvent.KEY_DOWN с wmode = "transparent" - PullRequest
1 голос
/ 22 декабря 2009

Когда я слушаю события нажатия клавиш и нажатия клавиш с wmode = "transparent", я получаю 2 события нажатия клавиш, за которыми следует одно событие нажатия клавиш для следующих клавиш: F-клавиши, клавиши со стрелками, ins, del, home , конец, страница вверх, страница вниз, пауза, экран печати, клавиша приложения, клавиша Windows и эквивалентные клавиши цифровой клавиатуры. Другие клавиши работают нормально. Это происходит с FF 3.5, но не с IE 6.

Ниже приведено простое приложение Flex, которое иллюстрирует проблему, если вы запускаете его с wmode = "transparent".

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" applicationComplete="init()">
<mx:Script>
 <![CDATA[
 import mx.controls.Label;
 private function init():void {
  stage.addEventListener(KeyboardEvent.KEY_DOWN, onKey);
  stage.addEventListener(KeyboardEvent.KEY_UP, onKey);
 }
 private function onKey(event:KeyboardEvent):void {
  var msg:Label = new Label();
  msg.text = event.toString();
  eventLog.addChildAt(msg, 0);
 }
]]>
</mx:Script>
<mx:VBox width="100%" height="100%">
 <mx:TextInput width="100%" text="Hello"/>
 <mx:VBox id="eventLog" width="100%" height="100%"/>
</mx:VBox>
</mx:Application>

Наше приложение требует wmode = "transparent" и должно обрабатывать события как вверх, так и вниз для проблемных клавиш, поэтому я ищу лучший способ решить эту проблему. Что было бы лучшим решением этой проблемы? Есть ли какой-нибудь параметр проигрывателя Flash, который я могу использовать, чтобы заставить это работать? (Изменения конфигурации FF не подходят для нашего приложения, но могут быть интересны для понимания причины этого.)

Ответы [ 2 ]

1 голос
/ 22 декабря 2009

Кстати, обходной путь, который я сейчас предпочитаю, - это сбросить дополнительные события нажатия клавиши для клавиши в течение короткой зоны нечувствительности (возможно, 50-100 мс) после ее первоначального события нажатия клавиши. Преимущество этого решения в том, что оно относительно простое в реализации, но при этом поддерживает повторы клавиш, но с дополнительной задержкой перед началом повторения.

Вот что я добавил к тестовому коду:

private var keyDownTs:Array = new Array();

private function onKey(event:KeyboardEvent):void {
    var msg:Label = new Label();
    msg.text = getTimer() + "-" + (isDead(event) ? "**DEAD**" : "") + event.toString();
    eventLog.addChildAt(msg, 0);
}

private function isDead(event:KeyboardEvent):Boolean {
    var dead:Boolean = false;
    switch (event.type) {
        case KeyboardEvent.KEY_DOWN:
            var ts:int = keyDownTs[event.keyCode];
            if (ts == 0) {
                // save timestamp for the initial key down event
                keyDownTs[event.keyCode] = getTimer();
            } else if (getTimer() - ts < 50) {
                // this key down is within the dead-band of the initial key down
                dead = true;
            }
            break;
        case KeyboardEvent.KEY_UP:
            // clear previous key down timestamp
            keyDownTs[event.keyCode] = 0;
            break;
    }
    return dead;
}

В моей системе события ложного нажатия клавиши происходят в течение нескольких мс после первоначального нажатия клавиши (2-6 мс), поэтому 50 мс выглядят как довольно хорошее значение. Для моей производственной реализации, я думаю, я собираюсь поместить эту логику в EventDispatcher, который будут использовать слушатели KeyboardEvent вместо непосредственного прослушивания сцены.

0 голосов
/ 22 декабря 2009

У меня нет ответа для вас, но я могу подтвердить, что wmode = "transparent" вызвал такое же поведение с элементом на нашем веб-сайте . Использование прозрачных и непрозрачных режимов вызывало неопознанное (до сих пор) двойное нажатие клавиш. Из-за многочисленных проблем с непрозрачными и прозрачными режимами, мы вместо этого обошли все остальные проблемы, связанные с использованием стандартного режима, потому что это единственный режим, в котором ввод-вывод клавиатуры работает правильно.

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

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

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

Не использовать отображение css: нет, потому что это сбрасывает фильм (но не использует версию AX в IE). Фильм можно скрыть, установив его высоту 0,001px с помощью CSS или видимости: скрытый в CSS или обоих.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...