AS3:检测长按键

时间:2009-01-11 17:27:24

标签: actionscript-3 keyboard-events

我有一个界面需要对“长按键”做出反应。这意味着根据密钥关闭的时间长度为同一个密钥执行2个不同的操作:

新闻左手:行动A

PRESS& HOLD LEFT CURSOR:行动B

嗯,这让我觉得更难。主要问题是,如果按住键,Keyboard.KEY-DOWN和Keyboard.KEY-UP都会连续触发。这对我来说很奇怪,但是如果考虑输入文本可能有意义(如果你输入文本并按住一个键就会开始填充空间)。

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

我知道键盘轮询类,例如BigRoomSenocular,但它们无法解决问题,因为它们的状态基于相同的事件。

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

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

谢谢,

4 个答案:

答案 0 :(得分: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时重置计数器,推断按键被按下而不是轻敲并放开。希望它有所帮助!

答案 1 :(得分:1)

抱歉,我花了这么长时间回来,但是在项目的中间,真的没有时间深入研究这个问题。现在我已经发现没有这样的问题了。请阅读下面的长篇答案。

这只是在非常具体的情况下才开始,而且可能没有人会责怪Adobe。

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

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

感谢每个人花时间研究这个问题。我希望这对其他人有帮助!

答案 2 :(得分:0)

您确定按下按键时KEY_UP会触发。听起来太奇怪了!我的Flex试用版已经过期,我还没有设置一个只使用SDK进行编译的环境,所以我无法试验这个。但是this actionscript.org forum thread about missing KEY_UP:s似乎暗示它可能是Flash播放器的设置问题。这与您遇到的问题不同,但如果他们遇到您的问题,他们肯定会抱怨...

答案 3 :(得分:0)

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

BTW:您的系统是否在不需要的key_up之后立即生成新的key_down?在这种情况下,你的键盘可能处于一些奇怪的设置,使它自动重复一个被按下的键。只是一个猜测...