简化代码:
//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事件存在一些漏洞:
我的问题是: 什么其他事件可能会中断MOUSE_UP事件并导致意外行为?
此外,还有一种方法可以为所有上下文菜单一般捕获ContextMenuEvent.MENU_SELECT,而无需手动添加/删除每个上下文菜单的监听器吗?
答案 0 :(得分:1)
this code might help
我用/* */
来评论一切不必要的东西
如果不适合您的情况,欢迎您升级该代码
答案 1 :(得分:0)
如果编译的swf是另一个swf的子节点,则Event.REMOVED_FROM_STAGE
或Event.REMOVED
事件可能会触发。我相信在那种情况下,引用了拥有文档的阶段,因此仍然没有问题。
FocusEvent.FOCUS_OUT
在用户放开鼠标之后才会触发,这会触发MouseEvent.MOUSE_UP
事件。
看来我的原始代码运行得很好。 (如果触发了子元素的上下文菜单,则存在漏洞的可能性。)
答案 2 :(得分:-1)
MOUSE_LEAVE
存在一个大问题:如果按住鼠标,则MOUSE_LEAVE
is not fired.
这是我在拖动过程中模拟MOUSE_LEAVE
的方法。幸运的是,当鼠标仍处于运行状态时,stage.mouseX
和stage.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...
}