【问题标题】:What flash events can interrupt a mouse_up event, and how do I detect them?哪些 flash 事件可以中断 mouse_up 事件,我如何检测它们?
【发布时间】:2011-05-13 14:46:55
【问题描述】:

简化代码:

//triggered on MouseEvent.MOUSE_DOWN
private function beginDrag(e:MouseEvent):void
{
  stage.addEventListener(MouseEvent.MOUSE_MOVE, drag);
  stage.addEventListener(MouseEvent.MOUSE_UP, endDrag);
  stage.addEventListener(Event.DEACTIVATE, endDrag);
  contextMenu.addEventListener(ContextMenuEvent.MENU_SELECT, endDrag);
}

private function drag(e:MouseEvent):void
{
  //do stuff
}

private function endDrag(e:Event):void
{
  stage.removeEventListener(MouseEvent.MOUSE_MOVE, drag);
  stage.removeEventListener(MouseEvent.MOUSE_UP, endDrag);
  stage.removeEventListener(Event.DEACTIVATE, endDrag);
  contextMenu.removeEventListener(ContextMenuEvent.MENU_SELECT, endDrag);
}

我在我的 Flash 代码中使用了一些点击和拖动技术,我注意到 MOUSE_UP 事件存在一些漏洞:

  • 如果在鼠标仍被按住的情况下激活上下文菜单,它将不会被触发。
  • 如果窗口被停用(alt+tab 或类似),它不会被触发

我的问题是: 哪些其他事件可能会中断 MOUSE_UP 事件并导致意外行为?

此外,有没有一种方法可以为 所有 上下文菜单一般捕获 ContextMenuEvent.MENU_SELECT 而无需手动添加/删除每个上下文菜单的侦听器?

【问题讨论】:

  • 你在拖什么拖什么?可拖动对象是否应该仅在鼠标悬停时移动,或者它在鼠标左键按下时移动到光标之后?我在问,因为在大多数情况下,恕我直言,最好是 MouseEvent.MOUSE_MOVE 侦听器和 event.buttonDown 检查是最佳实践
  • @www0z0k 显然您甚至没有阅读我的代码。如果可以的话,我会给你-1的评论。我已经掌握了拖拽的基本知识这不是问题问题是当一些无关的事件触发时会阻止MOUSE_UP事件被flash捕获。
  • 我最好发布一个答案 ;) Event.MOUSE_LEAVE 在调用上下文菜单时调度,当释放左 btn 的鼠标离开舞台或当鼠标离开时释放左 btn舞台

标签: flash actionscript-3 actionscript


【解决方案1】:

this code might help
我用/* */ 注释掉了所有不必要的东西
如果它不适合您的情况,非常欢迎您升级该代码

【讨论】:

  • @www0z0k 你的代码比我已经在使用的代码更糟糕。如果我在舞台上按住左键,然后单击鼠标右键,弹出上下文菜单,然后取消上下文菜单(在舞台外单击)蓝色对象继续附加到鼠标,尽管不再按住鼠标左键。这是我要求解决的特定类型的问题。
  • @zzzzBov 目前正在尝试修复它。我的代码还有什么问题吗?
  • @zzzzBov 用几个事件更新了我的代码,你能检查一下吗?
  • @www0z0k 您没有提供任何可能中断处理 MOUSE_UP 事件的 事件。我已经知道如何拖动了。我所要求的只是让某人提供可能导致问题的其他事件列表。 MOUSE_LEAVE 不会引起问题,FOCUS_OUT 可能会,如果您可以提供一些示例说明它如何以阻止 MOUSE_UP 事件触发的方式触发。我不明白为什么有人会赞成你的答案,因为它根本没有回答我的问题
  • @zzzzBov Event.DEACTIVATE 我无法在 Wonderfl 上找到问题
【解决方案2】:

如果编译的 swf 是另一个 swf 的子文件,则可能会触发 Event.REMOVED_FROM_STAGEEvent.REMOVED 事件。我相信在这种情况下,拥有文档的阶段被引用,因此仍然不是问题。

FocusEvent.FOCUS_OUT 直到 用户松开鼠标后才会触发,这将触发 MouseEvent.MOUSE_UP 事件。

看来我的原始代码运行良好。 (如果触发子元素的上下文菜单,可能会出现漏洞)。

【讨论】:

    【解决方案3】:

    MOUSE_LEAVE 有一个大问题:如果你按住鼠标,那么 MOUSE_LEAVE is not fired.

    这是我在拖动过程中模拟MOUSE_LEAVE 所做的。幸运的是,stage.mouseXstage.mouseY 在鼠标仍然按下时会更新。对于某些浏览器,您可能也需要MOUSE_LEAVE

        public function beginDrag(evt:MouseEvent):void
        {
            stage.addEventListener(MouseEvent.MOUSE_MOVE, drag);
            stage.addEventListener(MouseEvent.MOUSE_UP, endDrag);
            stage.addEventListener(Event.DEACTIVATE, endDrag);
            stage.addEventListener(Event.MOUSE_LEAVE, endDrag);
    
            _dragging = true;
        }
    
        public function drag(evt:MouseEvent):void
        {           
            // check if mouse has fallen off stage
            if (stage.mouseX < 0 || 
                stage.mouseY < 0 || 
                stage.mouseX > stage.stageWidth || 
                stage.mouseY > stage.stageHeight)
            {
                endDrag(evt);
                ExternalInterface.call("alert", "Dropped off");
                return;
            }
    
            // do drag stuff here...
        }
    

    【讨论】:

    • 你明显误解了MOUSE_LEAVE的目的。如果用户按住鼠标,mouse_move 事件通常会继续触发(如果 wmode 是不透明或透明的,则会出现问题),这允许您在鼠标不再位于舞台上方的情况下继续拖动。我的问题是关于中断MOUSE_UP 事件,而不是关于MOUSE_LEAVE
    • @zzzzBov - 所以你不是说我误解了你的问题 ;-) 我认为我所说的关于 MOUSE_LEAVE 是真的
    • MOUSE_LEAVE 被设计为在您按下鼠标离开舞台时触发。它会在鼠标松开时触发(某些浏览器中的 wmode 错误除外)。它不是作为MOUSE_OUT 的替代品而设计的。你可能会注意到它不是MouseEvent
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多