我有一个列表,其中包含整个应用程序中的显示对象(插入顺序)。
我想要自上而下(父,子)或自下而上(子,父)处理列表。唯一的要求是在父母之前处理父母,或者在父母之前处理父母。
什么是好方法?
编辑:此问题与排序列表无关。它是关于以特定方式检索特定显示对象的深度。
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之前。
答案 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对象可以。