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 等方法協助我們搜素到節點的位置,以後其他一些資訊,索引等等。
四,刪除節點
容器裡面擁有管理對象的能力。如果我希望刪除某一個節點,那麼就可以通過
兩個常用的方法來刪除。問題是由誰來負責刪除任務?調用者是誰?這樣是常見一個問題。調用者的職責就是刪除某一個節點,自然我們想到由容器本身執行。看上面的圖,C是根節點,A和B 都是他的子節點,如果我想刪除A ,那麼調用者自然是C(也就是說父節點),爸爸要刪除兒子,C.removeChild(A),因為A和B都是C的一部分分支。
同理 刪除和A和B的裡面的節點,同樣可以使用到這種理解的方式進行刪除。
這種常見的方式。
結果是建立起一種樹型的結構