我们可以关闭鼠标事件吗?

Can we turn off MouseEvents?

我一直在做一些关于 MouseEvents 的测试。感谢 Neal Davis,大部分内容都为我澄清了。现在,我想设计代码,每当我左键单击时,它就会开始沿着鼠标的 x 和 y 坐标绘制圆圈。当我松开鼠标左键时,它将停止绘制圆圈。我试图尽可能多地复制它,但这是我最终陷入困境的地方:

stage.addEventListener(MouseEvent.MOUSE_DOWN, mClickOn);
stage.addEventListener(MouseEvent.MOUSE_MOVE, mMove);
stage.addEventListener(MouseEvent.CLICK, mClickOff);

public var clickOn:Boolean;
public var clickOff:Boolean;

public function mClickOn(e:MouseEvent):void
{
    clickOn = e.buttonDown;
}

public function mClickOff(e:MouseEvent):void
{
    clickOff = e.buttonDown
}

public function mMove(e:MouseEvent):void
{
    if (clickOn) //keep drawing when left click
    {
        draw.create(e.localX, e.localY);
        addChild(draw);
    }
    else if (clickOff) //don't draw when you let go of left click
    {
        null;
    }
}

问题是左键单击时 MOUSE_DOWN 为 true,但我假设当我们不再左键单击时,它会自动 return 返回 false。根据我的测试,它在第一次点击后保持真实。至于CLICK,总是false。

如何使这些 MouseEvents 可以打开和关闭?我想做一支铅笔tool/simulator。

单击是按下鼠标按钮并再次松开。这对您的情况没有用,因为您想单独查看鼠标的向下和向上,以启动或停止绘图过程。在这里使用 MouseEvent.MOUSE_DOWNMouseEvent.MOUSE_UP 更合适。

要启动和停止进程,只需添加或删除侦听器即可在绘制和不绘制两种状态之间切换。

stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);

public function onMouseDown(e:MouseEvent):void
{
    stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove); 
    stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);

    stage.removeEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
}

public function onMouseUp(e:MouseEvent):void
{
    stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);  
    stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);

    stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
}

public function onMouseMove(e:MouseEvent):void
{
    draw.create(e.localX, e.localY);
    addChild(draw);
}

想法如下:

  1. 当鼠标按下时,设置一个标志为真,当鼠标抬起时将其设置为假。
  2. 在每个应用程序循环(计时器事件或进入帧事件)中检查该标志的值
  3. 选择 "draw circles" 工具后开始侦听 MOUSE_DOWN。
  4. 当鼠标按下时停止监听 MOUSE_DOWN 并开始监听 MOUSE_UP
  5. 当鼠标上升时,再次开始监听 MOUSE_DOWN 并停止监听 MOUSE_UP。
  6. 然后在选择工具时停止监听 MOUSE_DOWN。 (我没有在下面展示工具选择和取消选择部分。希望你明白了。对于每个工具,你都需要重复这个过程)

做这样的事情:

private function mDown(me:MouseEvent):void{
    _mDown = true;
    stage.removeEventListener(MouseEvent.MOUSE_DOWN, mDown);
    stage.addEventListener(MouseEvent.MOUSE_UP, mUp);
}

private function mUp(me:MouseEvent):void{
    _mDown = false;
    stage.removeEventListener(MouseEvent.MOUSE_UP, mUp);
    stage.addEventListener(MouseEvent.MOUSE_DOWN,mDown);
}

然后您需要一个 appTick 或 gameLoop 或 timerEvent,例如

stage.addEventListener(Event.ENTER_FRAME, applicationLoop);

private function applicationLoop(e:Event):void{
    if (_mDown == true){
        drawCircles();
    }

然后

private function drawCircles():void{
    // your draw logic
}

应该可以了。

注意 如果你想像喷漆工具一样画圆(即使鼠标不移动也会继续添加更多油漆)检查每帧的 _mDown 标志。如果您希望它仅在鼠标移动时添加圆圈,请改为检查 MOUSE_MOVE 事件上的标志。