【问题标题】:AS3: startDrag firing mouse_up/mouse_click eventsAS3:startDrag 触发 mouse_up/mouse_click 事件
【发布时间】:2011-10-10 17:57:50
【问题描述】:

当我开始使用 Adob​​e AIR 为 iOS/Android 开发移动应用程序时,我遇到了奇怪的问题(或功能)。

如果您创建 Sprite 并在 MOUSE_DOWN/MOUSE_UP 事件处理程序中使用 startDrag/stopDrag 使其可拖动,则一切正常。但是,如果您将另一个侦听器 MOUSE_CLICK 添加到同一对象,它会开始与 MOUSE_UP 一起触发。从逻辑上讲,这种行为是可以的。我需要的是防止在用户拖动 Sprite (startDrag) 时触发 MOUSE_CLICK 处理程序,并且我需要在用户没有拖动 Sprite 时触发它。

我要创建的是一个可拖动的小缩略图栏,单击具体缩略图后,它的大版本/图像会打开。这实际上是不可能的,因为每次用户拖动整个缩略图栏时都会触发 MOUSE_CLICK,因此每次都会打开大图像。

【问题讨论】:

    标签: flash actionscript-3


    【解决方案1】:

    您需要添加一个标志来指定您是否处于拖动模式。如果用户按住一段时间(例如 300 毫秒),则设置标志并随后忽略结束 MOUSE_CLICK 事件。请注意,我们在MOUSE_UP 处理程序中使用了 1 毫秒的超时时间来让事件在标志重置之前完成。另请注意,您实际上并不需要单击处理程序;如果dragInProgress==false,您可以在MOUSE_UP 处理程序中调用伪点击处理程序。

    private var dragTime:int = 300;
    private var dragInProgress:Boolean = false;
    private var dragInProgressInt:int;
    
    function handleMouseDown(event:MouseEvent):void
    {
        dragInProgressInt = setTimeout(function():void
        {
            dragInProgress = true;
        }, dragTime);
    
        // Start drag, etc.
    }
    
    function handleMouseUp(event:MouseEvent):void
    {
        clearTimeout(dragInProgressInt);
        setTimeout(function():void
        {
            dragInProgress = false;
        }, 1);
    
        // End drag, etc.
    }
    
    function handleMouseClick(event:MouseEvent):void
    {
        if (!dragInProgress)
        {
            // Handle the real click
        }
    }
    

    合乎逻辑的下一步是等待,例如甚至在开始拖动之前的 300 毫秒;当所有用户想要点击时,这将避免不必要的拖动操作的开始/停止。

    编辑:更正了对超时名称的引用中的错误。

    【讨论】:

    • 谢谢。这可能会奏效。首先,我想创建自己的 MOUSE_UP/_MOVE/_DOWN 处理程序(不使用 startDrag/stopDrag)。我想听听别人的想法:)
    • 实际上这是可行的,但有时用户只是一直拖动栏,因此 CLICK 事件会触发,因为他们在阅读时一直触摸屏幕。这会导致 CLICK 事件意外触发 :(
    • @MaRmAR:如果您直接复制/粘贴该代码,则会出现错误。对超时的引用不正确;我已经解决了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 2012-12-09
    相关资源
    最近更新 更多