【问题标题】:Is there a way for listening for changes in flash.display.DisplayObjectContainer numChildren property?有没有办法监听 flash.display.DisplayObjectContainer numChildren 属性的变化?
【发布时间】:2010-02-11 22:02:57
【问题描述】:

每当将 DisplayObject 作为子项添加到 DisplayObjectContainer 时,我都想运行一些代码。 或者换句话说,捕捉所有 DisplayObject 的 addedToStage 事件,即使是我不知道的。

有可能吗?如果没有,关于如何做类似事情的任何想法?

【问题讨论】:

    标签: actionscript-3 flex3


    【解决方案1】:

    每当通过 addChild() 或 addChildAt() 将子显示对象添加到显示列表时,就会调度一个“添加”事件。在 DisplayObjectContainer 类中添加监听器:

    addEventListener(Event.ADDED, onAdded);
    

    和处理程序:

    private function onAdded(e:Event):void
    {
        trace('number of children is now ' + numChildren);
    }
    

    【讨论】:

    • 干杯 wpjmurray :) 我以某种方式假设当对象本身作为某个其他容器的子对象添加时会触发此事件。 (我猜是懒得检查)
    • 是的,使用“added”作为事件类型有点令人困惑,因为“ added_to_stage”表示显示对象已添加到舞台,因此“添加”意味着此显示对象已添加到父显示对象。更好的事件类型应该是“child_added”或类似的东西。
    【解决方案2】:

    stage 对象上使用Event.ADDED_TO_STAGE 并将useCapture 设置为true。

    更多活动信息here

    示例:

    function onAdded(e:Event):void{
        trace(e.target.toString()); //use target to get the Object added
    }
    stage.addEventListener(Event.ADDED_TO_STAGE, onAdded, true); // set capture to true
    

    【讨论】:

      【解决方案3】:

      我不知道是否有内置方法可以做到这一点。

      替代方案包括显而易见的,

      private var _num_children:Number = 0;
      addEventListener(Event.ENTER_FRAME, _checkChildren, false, 0, true);
      
      private function _checkChildren($evt:Event):void {
          if (this.numChildren != _num_children) {
              _num_children = this.numChildren;
              // There was a child (or more) added in the last frame execution
          }
      }
      

      不过,这似乎是一个更优雅的解决方案...

      public function _addChild($do:DisplayObject) {
          $do .addEventListener(Event.ADDED_TO_STAGE, _childAdded);
          addChild($do );
      }
      
      private function _childAdded($evt:Event) {
          // do whatever with $evt.target
      }
      

      这里的不同之处在于,_childAdded 将针对通过 _addChild 方法添加的每个孩子触发。这意味着如果您正在执行一些昂贵的代码执行,您将为每个子实例执行一次。

      如果使用第一种方法,则每帧只调用一次该方法,如果在单帧上添加 10 张图像,则它只会运行一次。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-17
        • 2017-05-16
        • 2011-09-07
        • 1970-01-01
        • 2011-06-13
        相关资源
        最近更新 更多