【问题标题】:Easiest implementation of onReleaseOutside in AS3?在 AS3 中最简单的 onReleaseOutside 实现?
【发布时间】:2010-09-20 06:53:06
【问题描述】:

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

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

  • This one 触发 onReleaseOutside 即使没有对应的 onPress 事件。
  • This one 似乎效率很低,每次在应用内任意位置单击鼠标时,您都将添加和删除事件监听器。

必须有更简单的方法,不要告诉我 Adob​​e 在重写 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 处理程序,如果您按下方块,将鼠标拖到方块外面,然后松开鼠标,那么方块不会停止旋转,并且看起来像是被卡住了。

【问题讨论】:

  • 我从 AS2 迁移到 Flex 3,所以没有遇到这个问题。因此,尽管我无法提供答案,但请为引起我对这个问题的注意而投赞成票。干杯。
  • 如果你在舞台的空白区域释放就可以了。如果你在你的舞台上释放了一个未知的精灵怎么办?或者如果有多个按钮需要检查 releaseOutside 怎么办?

标签: flash actionscript-3 migration actionscript-2


【解决方案1】:

简单且万无一失:

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

【讨论】:

  • 记得移除 buttonMouseUpHandler 上的舞台监听器 ;)
  • 感谢 Antii,内容非常全面。但是有没有人也认为这有点愚蠢,不只是一个 MouseEvent.MOUSE_UP_OUTSIDE 来封装这个非常常见的场景......
  • aaaidan:Adobe 在转向 as3 时没有加入这个的原因是性能。为了触发此事件,显示对象必须知道在其外部发生的鼠标事件,这会增加一些开销。这是他们做出的一个已知决定,因为在大多数情况下,您无论如何都不需要这个,而且解决方法很简单。
  • 有没有办法在舞台上使用它?即我想做一些事情,如果用户将鼠标放在浏览器之外然后执行 mouse_up。(如果您觉得这是不可能的,请查看谷歌财务图表,如果您拖动滚动条,并在此过程中使用鼠标在窗口之外然后释放它,它只是将滚动条放在两端)
【解决方案2】:

你看过这个活动吗:

flash.events.Event.MOUSE_LEAVE



来自文档:

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

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

【讨论】:

    【解决方案3】:

    root.addEventListener(MouseEvent.UP, onMouseReleaseOutside);

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

    【讨论】:

      猜你喜欢
      • 2015-06-05
      • 2010-11-09
      • 2010-12-01
      • 1970-01-01
      • 2020-09-12
      • 2011-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多