表示オブジェクトコンテナの操作

Flash Player 9 以降、Adobe AIR 1.0 以降

DisplayObjectContainer オブジェクトが表示リストから削除されたか、何らかの方法で移動または変換された場合、DisplayObjectContainer 内の各表示オブジェクトも、削除、移動、変換されます。

表示オブジェクトコンテナはそれ自体が表示オブジェクトの 1 つの型であり、別の表示オブジェクトコンテナに追加できます。例えば、次の図は、アウトラインシェイプ 1 つと(PictureFrame 型の)表示オブジェクトコンテナ 4 つを含む表示オブジェクトコンテナ pictureScreen を示します。

フルサイズのグラフィックを表示
A.
pictureScreen 表示オブジェクトコンテナの境界を定義するシェイプ

B.
pictureScreen オブジェクトの子である表示オブジェクトコンテナ 4 つ

表示リストに表示オブジェクトを表示するには、表示リスト上にある表示オブジェクトコンテナに表示オブジェクトを追加する必要があります。 これには、コンテナオブジェクトの addChild() メソッドまたは addChildAt() メソッドを使用します。例えば、次のコードの最後の行がなければ、myTextField オブジェクトは表示されません。

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

このサンプルコードでは、コードを格納する MovieClip 表示オブジェクトコンテナを this.root によって指定します。実際のコードでは、別のコンテナを指定できます。

表示オブジェクトコンテナの子リスト内の特定の位置に子を追加するには、addChildAt() メソッドを使用します。子リスト内の 0 から始まるインデックス位置は、表示オブジェクトのレイヤー(前から後ろへの順)に対応しています。 例えば、次のような 3 つの表示オブジェクトがあるとします。 各オブジェクトは、Ball と呼ばれるカスタムクラスから作成されました。

コンテナ内のこれらの表示オブジェクトのレイヤーは、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 オブジェクト内で次のように配置されます。オブジェクトのレイヤーに注意してください。

表示リストの一番上にオブジェクトを再配置するには、リストにオブジェクトを再度追加するだけです。 例えば、前のコードの実行後、ball_A をスタックの最上部に移動するには、次のコード行を使用します。

container.addChild(ball_A);

このコードは、ball_Acontainer の表示リスト内から削除してリストの最上部に再度追加します。その結果、スタックの最上部に移動されます。

表示オブジェクトのレイヤーの順序を確認するには、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 演算子を使用します。

表示オブジェクトには親コンテナが 1 つだけあるので、その 1 つだけの表示オブジェクトコンテナに表示オブジェクトのインスタンスを追加できます。 例えば、次のコードは、表示オブジェクト tf1 が 1 つだけのコンテナ(この例では、DisplayObjectContainer クラスを拡張する Sprite)内にあることを示します。

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 クラスでは、子表示オブジェクトを操作するための次のようなメソッドが定義されています。

  • contains():表示オブジェクトが DisplayObjectContainer の子であるかどうかを指定します。

  • getChildByName():表示オブジェクトを名前によって取得します。

  • getChildIndex():表示オブジェクトのインデックス位置を返します。

  • setChildIndex():子表示オブジェクトの位置を変更します。

  • removeChildren():複数の子表示オブジェクトを削除します。

  • swapChildren():2 つの表示オブジェクトの重ね順を入れ替えます。

  • swapChildrenAt():指定されたインデックス位置にある 2 つの表示オブジェクトの重ね順を入れ替えます。

詳しくは、『Adobe Flash Platform 用 ActionScript 3.0 リファレンスガイド』の関連する項目を参照してください。

表示リスト外の表示オブジェクト、すなわち Stage の子である表示オブジェクトコンテナに含まれない表示オブジェクトをリスト外表示オブジェクトと呼びます。