在AS3中最简单的onReleaseOutside实现?

问题描述:

我是一个长期使用ActionScript 2的用户,现在开始使用ActionScript 3.我缺少的一件事是复制AS2的MovieClip.onReleaseOutside功能的简单方法。实现这个事件几乎总是有必要的,否则你会得到一些有趣的错误,比如闪光灯认为你的鼠标真的弹起来了。在AS3中最简单的onReleaseOutside实现?

根据AS2 to AS3 Migration Guide,我应该使用flash.display.InteractiveObject.setCapture()这个,但它不存在,据我所知。我猜这个文件已经过时或不正确。我发现如何复制此功能在网络上的几个职位,但他们要么有自己的问题:

  • This one触发onReleaseOutside在即使没有相应的onPress事件。
  • This one看起来效率很低,每次在应用程序内部的任何位置单击鼠标时,都会添加和删除事件侦听器。

必须有一个更简单的方法,不要告诉我Adobe重写Actionscript时忘了这个吗?

示例AS2代码:

// Assume myMC is a simple square or something on the stage 

myMC.onPress = function() { 
    this._rotation = 45; 
} 

myMC.onRelease = myMC.onReleaseOutside = function() { 
    this._rotation = 0; 
} 

没有onReleaseOutside在处理程序,如果你在squre压下去,拖你的鼠标在它之外,并释放鼠标,那么方不会取消旋转,并似乎卡住了。

+0

我从AS2移到了Flex 3,所以没有遇到这个问题。所以虽然我不能提供答案,但请注意这个问题。干杯。 – 2008-10-31 22:46:38

+0

如果您在舞台的空白区域释放,这将会很好。如果你在舞台上释放一个未知的精灵,该怎么办?或者如果有多个按钮需要检查releaseOutside? – 2012-01-12 21:47:57

简单,万无一失:

button.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); 
button.addEventListener(MouseEvent.MOUSE_UP, buttonMouseUpHandler); // * 

function mouseDownHandler(event : MouseEvent) : void { 
    trace("onPress"); 
    // this will catch the event anywhere 
    event.target.stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); 
} 

function buttonMouseUpHandler(event : MouseEvent) : void { 
    trace("onRelease"); 
    // don't bubble up, which would trigger the mouse up on the stage 
    event.stopImmediatePropagation(); 
} 

function mouseUpHandler(event : MouseEvent) : void { 
    trace("onReleaseOutside"); 
    event.target.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); 
} 

如果你不关心(例如用拖动的项目函数)onRelease和onReleaseOutside在之间的区别,你的跳过按钮本身鼠标向上监听器(在这里评论星号)。

有你看着这个事件:

flash.events.Event.MOUSE_LEAVE 



从文档:

由Stage对象进行调度当鼠标指针移出舞台区域。 Event.MOUSE_LEAVE常量定义mouseLeave事件对象的type属性的值。

如果你只关心它会解决你的问题是否与用户的鼠标,如果离开了舞台,而不仅仅是特定的影片剪辑之外。

root.addEventListener(MouseEvent.UP,onMouseReleaseOutside);

你当然定义onMouseReleaseOutside。基本上任何MouseEvent.UP(一个鼠标释放)发生在你的按钮(或mc)之外,都会触发舞台而不是你的按钮。这是我通常抓住它的方式。