AS3: обнаружение длинных нажатий клавиш - PullRequest
2 голосов
/ 11 января 2009

У меня есть интерфейс, который должен реагировать на "длительные нажатия клавиш". Это означает 2 различных действия для одного и того же ключа в зависимости от того, как долго он был выключен:

НАЖМИТЕ ЛЕВЫЙ КУРСОР: действие A

НАЖМИТЕ И ДЕРЖИТЕ ЛЕВЫЙ КУРСОР: действие B

Ну, это оказалось сложнее, чем я думал. Основная проблема заключается в том, что и Keyboard.KEY-DOWN, и Keyboard.KEY-UP срабатывают непрерывно, если удерживать клавишу нажатой. Это выглядит странно для меня, хотя может иметь смысл, если вы думаете о вменении текста (если вы вводите текст и удерживаете клавишу, он начинает заполнять пространство).

Когда я пытался решить проблему, я думал о запуске счетчика на KEY-DOWN и обнулении его на KEY-UP. Затем, если он достиг определенного порога, происходит событие. Проблема в том, что счетчик сбрасывается сразу, потому что они запускают событие KEY-UP постоянно.

Мне известны классы опроса клавиатуры, такие как BigRoom и Senocular , но они не решают проблему, поскольку основывают свой статус на тех же событиях .

Я мог бы пойти на таймеры, запускающие таймер на KEY-DOWN, и через x миллисекунд проверять, не выключен ли ключ, но это предполагает, что ключ все время выключен. Я не думаю, что это будет надежно.

И вот с этого момента у меня заканчиваются идеи. Есть ли гораздо более простой метод, который я пропустил? Я надеюсь, что есть!

Спасибо

Juan

Ответы [ 4 ]

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

Извините, что я так долго возвращался, но был в центре проекта и действительно не имел времени углубиться в это. Теперь у меня есть, и я обнаружил, что нет такой проблемы. Читайте подробный ответ ниже.

Это происходит только при очень определенных обстоятельствах и, вероятно, никто не виноват в этом.

У меня iMac под управлением Ubuntu, и я разрабатываю Flash на виртуальной машине под управлением Windows XP. Эта проблема возникает только в виртуальной XP, то же самое приложение, работающее в Ubuntu (и, возможно, в других системах), не показывает проблему.

И поскольку у меня есть некоторые другие странности клавиатуры при использовании виртуальной машины, я думаю, что проблема в драйвере клавиатуры VirtualBox.

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

Juan

1 голос
/ 24 января 2009

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

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" applicationComplete="app_applicationComplete()">

    <mx:Script>
        <![CDATA[

            private function app_applicationComplete():void
            {
                stage.addEventListener(KeyboardEvent.KEY_DOWN, app_keyDown);
                stage.addEventListener(KeyboardEvent.KEY_UP, app_keyUp);

                setFocus(); 
            }       

            private function app_keyDown(event:KeyboardEvent):void
            {
                trace("Down...");
            }

            private function app_keyUp(event:KeyboardEvent):void
            {
                trace("UP!");
            }

        ]]>
    </mx:Script>

</mx:Application>

Мои результаты больше похожи на это - три нажатия:

Down...
UP!
Down...
UP!
Down...
UP!

... и "Удерживайте и отпустите":

Down...
Down...
Down...
Down...
Down...
Down...
Down...
Down...
Down...
Down...
Down...
Down...
UP!

Просто подумал, что поделюсь; Я предполагаю, что это также возможно, хотя и маловероятно, что ваша клавиатура отправляет сообщения "вверх" в ОС, когда это не должно быть. Но, предполагая, что вы можете сделать эту работу, вы могли бы просто посчитать количество последовательных уведомлений KEY_DOWN, сбросив счетчик, когда вы получите KEY_UP, чтобы сделать вывод, что клавиша удерживается, а не нажата и отпущена. Надеюсь, это поможет!

0 голосов
/ 11 января 2009

Эта запись http://www.futtock.co.uk/flash/smooth-movieclip-key-control-in-as3/ может содержать подсказку.

Кстати: генерирует ли ваша система новый key_down сразу после нежелательного key_up? В этом случае ваша клавиатура может быть в какой-то странной настройке, заставляя ее автоматически повторять нажатую клавишу. Просто предположение ...

0 голосов
/ 11 января 2009

Вы уверены, что KEY_UP срабатывает при нажатии клавиши вниз. Это звучит так странно! Срок действия моей Flex-версии истек, и я не создал среду, в которой я могу компилировать, используя только SDK, поэтому я не могу экспериментировать с этим. Но эта ветка форума actionscript.org об отсутствии KEY_UP: s , похоже, предполагает, что это может быть проблема с настройками флэш-плеера Это не та проблема, с которой вы сталкиваетесь, но они наверняка будут жаловаться, если бы у них была ваша проблема, кажется ...

...