2

我有一个需要对“长按键”做出反应的界面。这意味着根据键按下的时间长短,对同一键执行 2 种不同的操作:

按左光标:动作 A

按住左光标:动作 B

好吧,事实证明我想的更难。主要问题是,如果您按住键,Keyboard.KEY-DOWN 和 Keyboard.KEY-UP 都会连续触发。这对我来说看起来很奇怪,尽管如果您考虑输入文本可能会有意义(如果您正在输入文本并按住一个键,它会开始填充空间)。

当我试图解决这个问题时,我想在 KEY-DOWN 上启动一个计数器并在 KEY-UP 上重置它。然后,如果它达到某个阈值,则触发一个事件。问题是计数器立即重置,因为它们 KEY-UP 事件一直在触发。

我知道诸如BigRoomSenocular之类的键盘轮询类,但它们并没有解决问题,因为它们的状态基于相同的事件。

我可以让定时器在 KEY-DOWN 上启动一个定时器,并在 x 毫秒后检查键是否仍然处于关闭状态,但这会假设该键一直处于关闭状态。我不认为这会是可靠的。

这就是我开始没有想法的地方。我忽略了一个更简单的方法吗?我希望有!

谢谢,

胡安

4

4 回答 4

1

只是想知道你是否找到了解决这个问题的方法。我没有同样的经历,所以我继续进行快速测试,看看我是否得到了相同的结果,但我没有——我只有在我真正放开钥匙时才得到 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 时重置计数器,以推断键被按住而不是轻按并松开。希望能帮助到你!

于 2009-01-23T21:26:43.153 回答
1

抱歉,我花了这么长时间才回来,但当时正处于项目中间,真的没有时间深入研究。现在我有并且我发现没有这样的问题。阅读下面的长答案。

这只是在非常特定的情况下发生,可能没有人责怪 Adob​​e。

我有一台运行 Ubuntu 的 iMac,并在运行 Windows XP 的虚拟机上开发 Flash。此问题仅出现在虚拟 XP 上,在 Ubuntu(可能还有其他系统)上本地运行的同一应用程序不会显示此问题。

而且因为我在使用 VM 时还有其他一些键盘怪癖,所以我认为问题出在 VirtualBox 的键盘驱动程序上。

感谢所有花时间研究此事的人。我希望这对其他人有帮助!

胡安

于 2009-02-01T19:35:40.333 回答
0

当您按下某个键时,您确定 KEY_UP 会触发吗?这听起来太奇怪了!我的 Flex 试用版已过期,我还没有设置可以仅使用 SDK 进行编译的环境,因此我无法对此进行试验。但是这个关于缺少 KEY_UP:s 的 actionscript.org 论坛主题似乎表明这可能是 Flash 播放器的设置问题。这与您遇到的问题不同,但是如果他们遇到您的问题,他们肯定会抱怨...

于 2009-01-11T18:26:44.440 回答
0

http://www.futtock.co.uk/flash/smooth-movieclip-key-control-in-as3/帖子可能包含提示。

顺便说一句:您的系统是否会在不需要的 key_up 之后立即生成新的 key_down?在这种情况下,您的键盘可能处于某种奇怪的设置中,使其自动重复按住的键。只是猜测...

于 2009-01-11T18:31:37.550 回答