按显示列表深度对显示对象进行排序

时间:2011-08-05 11:59:17

标签: flash flex actionscript-3

我有一个列表,其中包含整个应用程序中的显示对象(插入顺序)。

我想要自上而下(父,子)或自下而上(子,父)处理列表。唯一的要求是在父母之前处理父母,或者在父母之前处理父母。

什么是好方法?

编辑:此问题与排序列表无关。它是关于以特定方式检索特定显示对象的深度。

Edit2:示例

显示列表:

A (root)
    B1
        C1
        C2
            D1
    B2
        C3
            D2
            D3
        C4
            D4
    B3
        C5
            D5
    B4
        C6
    B5

我的清单:

list = [E1, F4, A, B2, B1, C3, ..., N9, N8]

自下而上:

N9, N8, F4, E1, C3, B2, B1, A

自上而下:

A, B2, B1, C3, E1, F4, N9, N8

注意:

N9之前的N9或N9之前的N8无关紧要。值得注意的是,任何N都在M(第一次运行)之前或在其子N *(第二次运行)之前的任何M之前。

2 个答案:

答案 0 :(得分:1)

如果我理解你的话:

    // bottom up    
    var num:int = parent.numChildren;
    var child:DisplayObject = null;
    for( var i:int = num - 1; i >= 0; i-- )
    {
        child = parent.getChildAt( i );
        // do whatever
    }

    // top down
    num = parent.numChildren;
    for( i = 0; i < num; i++ )
    {
        child = parent.getChildAt( i );
        // do whatever
    }

修改

好的,根据您的示例,您可以使用递归来执行此操作。类似的东西:

private var m_order:Vector.<DisplayObject> = new Vector.<DisplayObject>;

private function _doSomething( dObj:DisplayObject ):void
{
    // do my thing here

    // add to our order vector
    this.m_order.push( dObj );

    var container:DisplayObjectContainer = dObj as DisplayObjectContainer;
    if( container == null || container.numChildren == 0 )
        return;

    var len:int = container.numChildren;
    for ( var i:int = 0; i < len; i++ )
        this._doSomething( container.getChildAt( i ) );
}

// then start it off with
this._doSomething( root );

如果您可以先自上而下,这应该是盛大的。要返回(自下而上),只需反向遍历m_order Vector

如果你需要先自下而上,先创建数组,然后反向遍历,然后正常遍历。

这是我能想到的最简单的方法。此外,不是德国人,爱尔兰人:)

答案 1 :(得分:0)

Flex组件有nestLevel,但我不认为纯Flash / As3对象可以。