我们可以关闭鼠标事件吗?
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_DOWN
和 MouseEvent.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);
}
想法如下:
- 当鼠标按下时,设置一个标志为真,当鼠标抬起时将其设置为假。
- 在每个应用程序循环(计时器事件或进入帧事件)中检查该标志的值
- 选择 "draw circles" 工具后开始侦听 MOUSE_DOWN。
- 当鼠标按下时停止监听 MOUSE_DOWN 并开始监听 MOUSE_UP
- 当鼠标上升时,再次开始监听 MOUSE_DOWN 并停止监听 MOUSE_UP。
- 然后在选择工具时停止监听 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 事件上的标志。
我一直在做一些关于 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_DOWN
和 MouseEvent.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);
}
想法如下:
- 当鼠标按下时,设置一个标志为真,当鼠标抬起时将其设置为假。
- 在每个应用程序循环(计时器事件或进入帧事件)中检查该标志的值
- 选择 "draw circles" 工具后开始侦听 MOUSE_DOWN。
- 当鼠标按下时停止监听 MOUSE_DOWN 并开始监听 MOUSE_UP
- 当鼠标上升时,再次开始监听 MOUSE_DOWN 并停止监听 MOUSE_UP。
- 然后在选择工具时停止监听 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 事件上的标志。