處理顯示物件容器

若從顯示清單刪除 DisplayObjectContainer 物件,或是以其它方式移動或轉換,則也會刪除、移動或轉換 DisplayObjectContainer 中的各個顯示物件。

顯示物件容器本身就是一種顯示物件,它可以加入至另一個顯示物件容器中。例如,下列影像會顯示一個顯示物件容器 pictureScreen,其中包含一個邊框形狀及另外四個顯示物件容器 (屬 PictureFrame 類型):


四個使用者介面視窗的影像,除了包含不同的水果 (香蕉、梨、橘子和蘋果) 影像以外,每一個視窗都完全相同。

若要讓顯示物件出現在顯示清單中,您必須將它加入顯示清單的顯示物件容器中。您可以使用 addChild() 方法或容器物件的 addChildAt() 方法,執行這項作業。例如,若沒有下列程式碼的最後一行,就不會顯示 myTextField 物件。

var myTextField:TextField = new TextField();
myTextField.text = "hello";
this.root.addChild(myTextField);

在樣本程式碼中,this.root 會指向包含程式碼的 MovieClip 顯示物件容器;而在實際的程式碼中,您可以指定不同的容器。

您可以使用 addChildAt() 方法,將子系加入顯示物件容器子清單中的特定位置。子清單中這些從零開始的索引位置與顯示物件的圖層 (由前至後順序) 相關。例如,假設有下列三個顯示物件。每一個物件都是透過稱為 Ball 的自訂類別加以建立。


三個黃色圓形代表顯示物件,它們會水平排成一列而不重疊,並由左至右標示為 "a"、"b" 和 "c"

您可以使用 addChildAt() 方法,調整這些顯示物件在容器中的圖層。例如,請考慮下列程式碼:

ball_A = new Ball(0xFFCC00, "a");
ball_A.name = "ball_A";
ball_A.x = 20;
ball_A.y = 20;
container.addChild(ball_A);

ball_B = new Ball(0xFFCC00, "b");
ball_B.name = "ball_B";
ball_B.x = 70;
ball_B.y = 20;
container.addChild(ball_B);

ball_C = new Ball(0xFFCC00, "c");
ball_C.name = "ball_C";
ball_C.x = 40;
ball_C.y = 60;
container.addChildAt(ball_C, 1);

執行這段程式碼之後,顯示物件就會如下所示放置於 container DisplayObjectContainer 物件中。請注意物件的圖層。


在執行程式碼之後出現的三個相同圓形。"b" 與 "a" 的右邊緣重疊。"c" 與 "a" 的右下方重疊,而且與 "b" 的左下方重疊。

若要將物件重新放置在顯示清單頂端,只要重新將它加入清單中即可。例如,執行上一個程式碼之後,若要將 ball_A 移至堆疊頂端,請使用下列這行程式碼:

container.addChild(ball_A);

這段程式碼會有效地自其 container 顯示清單中的位置移除 ball_A,再重新將它加入清單的頂端,最後結果是將它移至堆疊的頂端。

您可以使用 getChildAt() 方法,確認顯示物件的圖層順序。getChildAt() 方法會根據您傳遞給它的索引編號,傳回容器的子物件。例如,下列程式碼會在 container DisplayObjectContainer 物件的子清單中之不同位置上顯示出顯示物件的名稱:

trace(container.getChildAt(0).name); // ball_A
trace(container.getChildAt(1).name); // ball_C
trace(container.getChildAt(2).name); // ball_B

如果您從父容器的子清單移除顯示物件,清單上高於此物件的元素會在子索引中各自下移一個位置。例如,接續上一段程式碼的下列程式碼會示範,如果將子清單中下面一個顯示物件移除之後,container DisplayObjectContainer 中在位置 2 的顯示物件如何移至位置 1:

container.removeChild(ball_C);
trace(container.getChildAt(0).name); // ball_A
trace(container.getChildAt(1).name); // ball_B

removeChild()removeChildAt() 方法不會完全刪除顯示物件實體,而只是將它們從容器的子清單中移除。此實體仍然可以由另一個變數進行參考(使用 delete 運算子,可將物件完全移除)。

由於顯示物件只有一個父容器,所以您只能將顯示物件的實體加入一個顯示物件容器。例如,下列程式碼會示範顯示物件 tf1 只能存在於一個容器中 (在此範例中是 Sprite,它可擴充 DisplayObjectContainer 類別):

tf1:TextField = new TextField();
tf2:TextField = new TextField();
tf1.name = "text 1";
tf2.name = "text 2";

container1:Sprite = new Sprite();
container2:Sprite = new Sprite();

container1.addChild(tf1);
container1.addChild(tf2);
container2.addChild(tf1);

trace(container1.numChildren); // 1
trace(container1.getChildAt(0).name); // text 2
trace(container2.numChildren); // 1
trace(container2.getChildAt(0).name); // text 1

若將包含於一個顯示物件容器中的顯示物件加入至另一個顯示物件容器中,它會自第一個顯示物件容器的子清單中移除。

除了上述方法外,DisplayObjectContainer 類別也會定義一些方法以配合子顯示物件使用,包括下列方法:

如需詳細資訊,請參閱「ActionScript 3.0 語言和組件參考」中的相關項目。

請回憶顯示清單外的顯示物件,也就是不包含於「舞台」子系顯示物件容器中的顯示物件,稱為「清單外」顯示物件。


Flash CS3

 

有新的意見加入至這個頁面時,傳送電子郵件給我 | 意見報告

目前頁面: http://livedocs.adobe.com/flash/9.0_tw/main/00000148.html