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的里面的节点,同样可以使用到这种理解的方式进行删除。

 

这种常见的方式。

结果是建立起一种树型的结构

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐