每个MOUSE_DOWN都保证MOUSE_UP吗?

时间:2011-07-14 17:14:55

标签: actionscript-3 events drag-and-drop mouse

在任何情况下,Flash应用程序都可以在两个MouseEvent.MOUSE_DOWN之间收到两个MouseEvent.MOUSE_UP吗?

在我的ActionScript 3应用程序中,我想跟踪用户拖动精灵。我的计划是监听MouseEvent.MOUSE_DOWN,启动无限重复的计时器,记录鼠标位置,并在MouseEvent.MOUSE_UP上停止计时器。这是一个好计划吗?

4 个答案:

答案 0 :(得分:5)

  • 点击但不要释放按钮。
  • 按住按钮的同时将光标移到外面。
  • 释放外面的按钮。
  • 回到里面然后再次点击。

如果没有up事件,您将获得两次失败事件。

更好的拖放解决方案可能是监听MOUSE_MOVE事件,并在事件处理程序中检查buttonDown属性。如果按钮在移动时关闭,则为真,否则为假。

编辑:对于舞台,即使您在Flash窗口外释放按钮,也会触发向上事件。所以对于舞台来说这可行,但是使用MOUSE_MOVEbuttonDown而不是使用public class StageEventTest extends Sprite { public function StageEventTest() { stage.addEventListener(MouseEvent.MOUSE_DOWN, onDown); stage.addEventListener(MouseEvent.MOUSE_UP, onUp); stage.addEventListener(MouseEvent.MOUSE_MOVE, onMove); } private function onDown(evt:MouseEvent):void { trace("down"); } private function onUp(evt:MouseEvent):void { trace("up"); } private function onMove(evt:MouseEvent):void { trace("move", evt.buttonDown); } } 的计时器对我来说更好。您可以使用以下代码进行检查:

{{1}}

答案 1 :(得分:4)

如果鼠标位于舞台之外,它会错过鼠标向上事件,并且当鼠标悬停在舞台上时继续鼠标跟踪,因为鼠标向上事件从未被调用过。使用Event.MOUSE_LEAVE可以缓解这个可能的问题 - 将鼠标离开事件转发到鼠标向上事件处理程序,这样如果用户将鼠标移离舞台,则会调用鼠标向上事件。

答案 2 :(得分:2)

是的,但除非你正在听舞台,否则我认为如果鼠标已超出Flash影片,你可能会错过鼠标事件。但是没有什么能比实验更好。

答案 3 :(得分:2)

下面你可以找到我一直用于自定义拖动的代码。通常,它应该工作正常。我收听MOUSE_MOVE事件以重新定位和跟踪精灵,但您也可以使用Event.ENTER_FRAME事件或使用计时器。

ObjectToDrag.addEventListener(MouseEvent.MOUSE_DOWN, startCustomDrag);

public function startCustomDrag(e:MouseEvent):void
{
    _prevX= e.stageX;
    _prevY= e.stageY;

    stage.addEventListener(MouseEvent.MOUSE_MOVE, dragObject); //REPLACE BY TIMER OR Event.ENTER_FRAME
    stage.addEventListener(MouseEvent.MOUSE_UP, stopCustomDrag);
}

private function dragObject(e:MouseEvent):void
{
    ObjectToDrag.x += _prevX - e.stageX; //OR ANY OTHER CALCULATION
    ObjectToDrag.y += _prevY - e.stageY; //OR ANY OTHER CALCULATION

    _prevX= e.stageX;
    _prevY= e.stageY;
}

public function stopCustomDrag(e:MouseEvent):void
{
    stage.removeEventListener(MouseEvent.MOUSE_MOVE, dragObject); //REPLACE BY TIMER OR Event.ENTER_FRAME
    stage.removeEventListener(MouseEvent.MOUSE_UP, stopCustomDrag);
}