我是一个长期的ActionScript 2用户,现在开始使用ActionScript 3.我缺少的一件事是复制AS2的MovieClip.onReleaseOutside功能的简单方法。几乎总是有必要实现这个事件,否则你会得到一些有趣的错误,比如flash认为你的鼠标已经关闭了。
根据AS2 to AS3 Migration Guide,我应该使用flash.display.InteractiveObject.setCapture()
,但据我所知它并不存在。我猜这个文件已经过时或不正确。我在网上发现了一些关于如何复制这个功能的帖子,但是他们有自己的问题:
必须有一种更简单的方法,不要告诉我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 :(得分:10)
简单而万无一失:
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之间的区别(例如可拖动项目),您可以跳过按钮本身的鼠标向上监听器(此处用星号标注)。
答案 1 :(得分:3)
你看过这个事件了吗?
flash.events.Event.MOUSE_LEAVE
来自文档:
当鼠标指针移出舞台区域时由Stage对象调度。
Event.MOUSE_LEAVE常量定义mouseLeave事件对象的type属性的值。
如果您只关心用户的鼠标是否在舞台上而不是在特定的MovieClip之外,它将解决您的问题。
答案 2 :(得分:3)
root.addEventListener(MouseEvent.UP,onMouseReleaseOutside);
你定义onMouseReleaseOutside当然。基本上任何发生在按钮(或mc)之外的MouseEvent.UP(鼠标释放)都会触及舞台而不是按钮。这是我通常捕捉它的方式。