4

我是 ActionScript 2 的长期用户,现在开始使用 ActionScript 3。我缺少的一件事是复制 AS2 的 MovieClip.onReleaseOutside 功能的简单方法。几乎总是有必要实现这个事件,否则你会得到一些有趣的错误,比如 flash 认为你的鼠标在真正启动时已经关闭。

根据AS2 to AS3 Migration Guide,我应该使用flash.display.InteractiveObject.setCapture()它,但据我所知它并不存在。我猜这个文件已经过时或不正确。我在网上找到了一些关于如何复制此功能的帖子,但它们都有自己的问题:

  • 即使没有相应的 onPress 事件,这个也会触发 onReleaseOutside。
  • 似乎非常低效,每次在应用程序内的任何位置单击鼠标时,您都将添加和删除一个事件侦听器。

必须有更简单的方法,不要告诉我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 处理程序,如果您按下方形,将鼠标拖到方形之外,然后释放鼠标,则方形不会停止旋转,并且似乎被卡住了。

4

3 回答 3

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 之间的区别(例如对于可拖动项目),您可以跳过按钮本身的鼠标向上监听器(此处用星号注释)。

于 2008-11-02T21:56:14.640 回答
3

你看过这个事件吗:

flash.events.Event.MOUSE_LEAVE



从文档中:

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

如果您只对用户的鼠标是否离开舞台而不是在特定的 MovieClip 之外感兴趣,它将解决您的问题。

于 2008-11-01T19:42:17.577 回答
3

root.addEventListener(MouseEvent.UP, onMouseReleaseOutside);

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

于 2008-11-01T19:52:50.347 回答