【问题标题】:AS3: Detect long key pressesAS3:检测长按键
【发布时间】:2009-02-02 03:35:40
【问题描述】:

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

按左光标:操作 A

按住左光标:操作 B

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

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

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

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

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

谢谢,

胡安

【问题讨论】:

    标签: actionscript-3 keyboard-events


    【解决方案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 时重置计数器,以推断键被按住而不是轻按并松开。希望对您有所帮助!

    【讨论】:

    • 您好,“您的键盘在不应该向操作系统发送“向上”消息时,这让我不得不找出问题所在。塔:)
    • 太好了,我想知道这个结果如何。告诉我进展如何!
    【解决方案2】:

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

    这只是在非常特殊的情况下才会发生,这可能不归咎于 Adob​​e。

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

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

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

    胡安

    【讨论】:

    • 啊!这是虚拟机做一些奇怪的事情来模拟自动重复。很有意思。 (我的意思是,很奇怪。)
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-21
        • 2017-05-11
        • 1970-01-01
        • 2012-10-11
        • 2016-08-01
        相关资源
        最近更新 更多