【问题标题】:How do I access all of the children of a DisplayObject programatically?如何以编程方式访问显示对象的所有子项?
【发布时间】:2011-05-10 13:22:50
【问题描述】:

如何使用代码访问 DisplayObject 的所有子项? (我正在寻找类似movieclip.children 的东西)

我在两种情况下使用它:

1) 循环并重新定位封闭 MovieClip 的所有子级。

或者

2) 循环并删除 MovieClip 的所有子项

另外,这是一个 Flash CS5 项目。

【问题讨论】:

    标签: actionscript-3 actionscript flash-cs5 displayobject


    【解决方案1】:

    如果您需要访问所有孩子,包括孩子的孩子,您可以尝试 这个:

        function doWhatever( mc:DisplayOjectContainer ):void
        {
              if( mc.numChildren > 0 )
                 for( var i:int ; i < mc.numChildren ; ++i )
                 {
                     //if you need to reposition
                    //set the points properties here
                    var point:Point = new Point( _x , _y );
                    setPosition ( mc.getChildAt(i ) , point );
    
                    //if you need to remove all children
                    //do it recursively
                    //remove( mc , mc.getChildAt( i );
                 }
        }
    
        function setPosition(mc:DisplayObject , point:Point ):void
        {
            mc.x = point.x ;
            mc.y = point.y;
        }
    
        function remove(container:DisplayObjectContainer , child:DisplayObject ):void
        {
             //this will remove all children before being removed
             if( child is DisplayObjectContainer )
             {
                 var doc:DisplayObjectContainer = child as DisplayObjectContainer;
                 doWhatever( doc );
             }
    
             container.removeChild( child );
             child = null;
        }
    

    【讨论】:

      【解决方案2】:

      您的对象只是一个显示对象吗?如果它是一个 UIComponent,您可以使用 getChildAt() 和 getChildByName() 以及 numChildren 属性来循环它们。这部分是 flex 项目还是仅 actionscript 项目?

      DisplayObject 本身没有描述其子对象的机制。了解子项的最低级别类型是 DisplayObjectContainer。您可能必须将对象至少转换为 DisplayObjectContainer 才能执行您想要的操作。如果你有 flex 框架可以使用,我会选择 UIComponent。

      DisplayObject

      DisplayObjectContainer

      UIComponent

      【讨论】:

        【解决方案3】:

        这个循环将触及movieclip foo 中的每个孩子。我不确定你要对它们做什么,但你可以在循环中运行任何你需要的方法。

        for (var i:uint=0; i<foo.numChildren;i++){
            foo.getChildAt(i).whateverMethodYouNeed();
        }
        

        【讨论】:

        • 请注意,没有像 children[n] 这样的数组样式访问器。您总是使用get 方法来一对一地访问孩子。
        • 错误答案有两个原因:循环比 var i:int = numChildren; 慢while(i-- > 0) getChildAt(i), DisplayObject 没有方法“whateverMethodYouNeed”
        猜你喜欢
        • 2017-01-14
        • 1970-01-01
        • 2013-09-05
        • 1970-01-01
        • 2011-01-03
        • 1970-01-01
        • 1970-01-01
        • 2020-05-18
        • 1970-01-01
        相关资源
        最近更新 更多