【问题标题】:AS3: Determining when a DisplayObject has been removed from the stage?AS3:确定何时从舞台上移除了 DisplayObject?
【发布时间】:2012-03-03 03:20:46
【问题描述】:

REMOVED_FROM_STAGE 事件在对象实际从舞台中移除之前被触发。我正在寻找一种高效的方法来了解对象何时最终被移除。有什么建议吗?

【问题讨论】:

  • 一种骇人听闻的方法是在 REMOVED_FROM_STAGE 发生时启动一个计时器,以设置一个轻微的延迟以等待它被删除,但我建议这仅作为最后的手段。
  • 感谢您没有将其作为答案! ;)
  • 大声笑,出于好奇,一旦您知道显示对象已从舞台上移除,您究竟想完成什么?
  • 由于 AS3 是一种异步语言,因此您永远无法获得与某事发生完全相同的事件。它要么在之前,要么在之后。你想达到什么目的?
  • 我不太关心我的细节,而是对解决问题的方法感兴趣,因为没有直接的解决方案。将问题编辑为更具体。

标签: actionscript-3 events stage


【解决方案1】:

您可以检查对象阶段值。

if (!object.stage) {
  //not added to display list
} 

可能在REMOVED_FROM_STAGE 被触发时设置一个enterframe 监听器。

object.addEventListener(Event.REMOVED_FROM_STAGE, removed, false, 0, true);

private function removed(e:Event):void {
    e.target.removeEventListener(Event.REMOVED_FROM_STAGE, removed);    
    e.target.addEventListener(Event.ENTER_FRAME, checkStage, false, 0, true);
}

private function checkStage(e:Event):void {
    if (!e.target.stage) {
        //object has been removed
        e.target.removeEventListener(Event.ENTER_FRAME, checkStage);
        //do something now it has been removed
    }
}

【讨论】:

  • 我不喜欢使用 ENTER_FRAME,但它肯定可以工作。 +1
【解决方案2】:

你是如何移除你的对象的?

重绘屏幕之前的最后一个事件是渲染事件。

你就不能听听吗?就像从舞台上移除了一个对象一样,舞台将不得不重新绘制自己。

stage.invalidate();
stage.addEventListener(Event.RENDER, doAfter, false, 0, true);

【讨论】:

  • 谢谢!很好的主意。我编辑为其他可能好奇的人添加示例代码。您需要在舞台上调用 invalidate() 来捕捉事件。
【解决方案3】:

您可以随时检查目标对象的父属性是否为空。 何时以及如何检查取决于您的应用程序结构等。

if (targetObject !== null && targetObject.parent === null) {
    // target object has been removed from display list
} else {
    // target object is still in display list
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多