Сортировка экранных объектов по глубине списка отображения - PullRequest
1 голос
/ 05 августа 2011

У меня есть список, содержащий экранные объекты из всего приложения (порядок вставки).

Я хочу обработать список сверху вниз (родительский, дочерний) или снизу вверх (дочерний, родительский).Единственное требование заключается в том, что родитель обрабатывается либо перед любым потомком, либо наоборот перед потомком.

Что такое хороший подход?

Редактировать: Этот вопрос не о сортировке списка,Речь идет о оперативном получении глубины определенного экранного объекта.

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 * (второй запуск).

Ответы [ 2 ]

1 голос
/ 05 августа 2011

Если я вас правильно понял:

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

Edit:

Хорошо, основываясь на вашем примере, вы можете использовать рекурсию для этого. Что-то вроде:

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.

Если вам нужно сделать это сначала снизу вверх, то сначала создать массив, затем обратный ход, затем нормальный ход.

Это самый простой способ, о котором я могу думать. Также не немецкий, ирландский :) 1016 *

0 голосов
/ 05 августа 2011

Компоненты Flex имеют nestLevel, но я не думаю, что чистые объекты Flash / As3 имеют.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...