DisplayObjectContainer 类是可用作显示列表中显示对象容器的所有对象的基类。作为容器类,我们使用as3的时候,接触太多了,随便都要写addChild 或者removeChild方法操作我们的显示对象。对于这个容器类,你认识多少?我不一定可以给一个满意的答案给你,但是我们可以交流一起讨论完成对这个容器类的理解。
容器简单来讲,就是装东西的器皿。在生活中,用它装水,装汤等例子。在as3里面同样有着同样的功能,DisplayObjectContainer 类不能实例化,我们不需要进行对它进行实例化,才调用它的方法,对于容器这种概念,在as3里面是一个非常重要的概念。容器里面,可以装载我们的显示对象,习惯使用addchild 或者使用addChildAt,这样我们一个个实例对象就可以添加到容器里面了。建立容器后,是否就不需要我们去管理呢?对于容器这种管理方式,这是一个很值得去研究的话题。计算机有一个很重要的数据结构------树。这个与我们有什么关系呢? 答案很简单,采用树这存储结构,显得更加健壮。
一,树的结构
树结构 有根节点,有子节点,另外说法,爸爸下有儿子。
我们看一下,addChild,在继承了Sprite类的时候,使用这方法添加了一个对象
public class example extends Sprite
{
public function example()
{
addChild(xxxxx);
}
}
}
图里面简单说C 有A和B,而A和B分别包含了1-4.
问题:addChild 对象的时候,有先后顺序吗?
这里不回答,尝试一下
addChild(A) addChild(B)
addChild(B) addChild(A)
区别在那里?
二,索引表
添加容器后,在容器里面的对象是有索引的,有顺序的。删除某一个对象后,索引表会发生相应的改变。在这个容器内里面我为它定义这一个概念。使用索引表的时候,这样对我们搜素节点和理清容器内部关系有很大帮助。添加一个对象后,索引表就会建立起来,他所在的索引就为0,再增加一个就会变成1.numChildren数目会变成2。(可以看上面的图)
三、添加节点
看到上面树的结构,可以想像出树的形态的千之百态,一棵树怎么可以没有叶子呢?他是是不每年春天才可以长出叶子呢?事实上,很多情况树冬眠后,会发芽。但是在As3里面,添加节点就仅仅使用addChild(显示对象) 或者addChildAt 两个常见的方法就可以实现为树添加子叶。是不是觉得很方便呢?可以去尝试一下,但是问题是,是不是所有的对象都适合添加到容器当中呢?这就要看addChild 装的是神还是鬼。addChild 所在的参数里面,很显然就要需要继续Displayobject的子对象,不然尝试去添加一个bitmapdata对象的,看看能否实现?添加节点后,索引表就是建立起来。进行对节点删除,或者查询的时候,就要好好利用这个索引关系。
三,容器内搜索节点
容器是一个显示对象管理者,它具备添加,删除,修改,查询等功能。
查询的功能是容器类一个很有趣的地方,之所以有趣,我们可以想象一下,在树上寻找一片叶子那样。我们如同一个会爬树的猴子 ,树叶的数目有限,因此可具搜索性。通过循环,我们可以搜索到我们想要的叶子。
容器类里面恰好提供了这个帮助。如getChildAt getChildByName getChildIndex 等方法帮助我们搜素到节点的位置,以后其他一些信息,索引等等。
四,删除节点
容器里面拥有管理对象的能力。如果我希望删除某一个节点,那么就可以通过
removeChild | () |
removeChildAt | () |
两个常用的方法来删除。问题是由谁来负责删除任务?调用者是谁?这样是常见一个问题。调用者的职责就是删除某一个节点,自然我们想到由容器本身执行。看上面的图,C是根节点,A和B 都是他的子节点,如果我想删除A ,那么调用者自然是C(也就是说父节点),爸爸要删除儿子,C.removeChild(A),因为A和B都是C的一部分分支。
同理 删除和A和B的里面的节点,同样可以使用到这种理解的方式进行删除。
这种常见的方式。
结果是建立起一种树型的结构