繁体   English   中英

flash AS3 如何删除舞台事件监听器

[英]flash AS3 how do I remove stage event listeners

我正在 flash 和 as3 中构建一个 animation,我有一个 function 在其中我添加了一个舞台 eventListener,stage.addEventListener(Event.0ENTER);

由于此事件是在 function 的 function 中设置的,“两个函数深度”,如何从函数外部重置所有阶段事件侦听器而不会出现错误?

AS 事件监听器的最佳实践是:

  • 让它变弱(就像你所做的那样,addEventListener的最后一个参数)
  • 处理后将事件监听设置为null(严格来说如果设置为weak则不需要)

Flex 没有给你析构函数。 它有自己的垃圾收集器在后台运行,管理 memory。 一旦没有对它的引用,它就会清理一块 memory。 好吧,强有力的参考。 默认情况下,所有对象都具有强引用。 事件处理程序,因为它们往往是性能瓶颈,所以有这种声明自己弱的特殊能力——弱引用。 这当然只有在您使用addEventHandler() function 附加事件处理程序时才有可能。 GC 不考虑弱引用,因此,当所有强引用都消失时,它们将自动被垃圾收集,从而使您摆脱必须手动执行=null的压力。 当您不指定参数时,您会这样做。 默认情况下,即使处理程序也被创建为强引用。

但是,将它们标记为弱有副作用。 他们可以在你不知道的情况下消失在空气中。 最终,你会知道,但就一个讨厌的错误而言。 这就是造成你问题的原因吗? 也许,也许不是。 你必须进行实验。 此外,如果您可以向我们提供更多详细信息,例如确切的错误代码、某些来源,这将有所帮助。

希望这可以帮助。 快乐弯曲:)

你看到了什么错误? 嵌套级别应该与它无关,因为侦听器只是通过参数注册的,所以只要您使用与添加相同的三个关键参数调用 remove,就可以了。

您真正的问题是如何获得对外部 scope 的监听器 object 的引用? 如果是这样,有几种可能的解决方案,最好的方法取决于代码的结构。

——马库斯

您应该可以只使用旧的 function 并使用 removeEventListeners 而不是 add。 其实很简单。

您的问题的答案,我知道您对 scope 有疑问,因为我刚刚回答了您对 scope 提出的问题,即您正在使用舞台。 考虑全局舞台,因为它是绘制所有显示对象的 canvas。

以下将在任何地方工作!!!

stage.addEventListener(Event.ENTER_FRAME, setScrollPercent, false, 0, true);

现在,您所说的错误,IM GUESSING,是您仅在准备好时将上述内容设置为 removeEventListener ,这是行不通的。

removeEventListener function 不接受与其兄弟 addEventListener 一样的五个参数,它只允许三个忽略优先级和弱引用,如下所示。

//The following removes YOUR stage Event.ENTER_FRAME listener from any scope.
stage.removeEventListener(Event.ENTER_FRAME, setScrollPercent, false);

希望这会有所帮助,请记住,从某种意义上说,stage 是全局根,并且要小心 root,它实际上是按现在应该的方式工作的,因为调用 root 现在是相对于你调用它的 swf,而不是 stage , 除非阶段是当前 scope 的根。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM