在任何情况下,Flash应用程序都可以在两个MouseEvent.MOUSE_DOWN
之间收到两个MouseEvent.MOUSE_UP
吗?
在我的ActionScript 3应用程序中,我想跟踪用户拖动精灵。我的计划是监听MouseEvent.MOUSE_DOWN
,启动无限重复的计时器,记录鼠标位置,并在MouseEvent.MOUSE_UP
上停止计时器。这是一个好计划吗?
答案 0 :(得分:5)
如果没有up事件,您将获得两次失败事件。
更好的拖放解决方案可能是监听MOUSE_MOVE
事件,并在事件处理程序中检查buttonDown
属性。如果按钮在移动时关闭,则为真,否则为假。
编辑:对于舞台,即使您在Flash窗口外释放按钮,也会触发向上事件。所以对于舞台来说这可行,但是使用MOUSE_MOVE
和buttonDown
而不是使用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);
}