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



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

我想处理列表或者自顶向下(父,子)或自底向上(子,父)。唯一的要求是父节点在任何子节点之前处理,反之亦然,子节点在其父节点之前处理。

什么是好的方法?

编辑:这个问题不是关于排序列表。它是关于性能检索一个特定的显示对象的深度。

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在N8之前还是N8在N9之前。重要的是,任何N在M之前(第一次运行),或任何M在其子N*之前(第二次运行)。

如果我没理解错的话:

    // 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

如果你需要先从下往上做,那么先创建数组,然后反向遍历,然后正常遍历。

这是我能想到的最简单的方法。还有,不是德语,是爱尔兰语:)

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

最新更新