既に見たように、表示リストはツリー構造です。ツリーの一番上には、複数の表示オブジェクトを含めることができるステージがあります。 これらの表示オブジェクトは、それ自体が表示オブジェクトコンテナであり、別の表示オブジェクト、つまり表示オブジェクトコンテナを含めることができます。
DisplayObjectContainer クラスには、表示オブジェクトコンテナの子リストを使用して表示リスト内を移動するためのプロパティとメソッドが含まれています。 例えば、次のようなコードがあるとします。このコードは、2 つの表示オブジェクト
title
と
pict
を
container
オブジェクト(Sprite、Sprite クラスは DisplayObjectContainer クラスを拡張します)に追加します。
var container:Sprite = new Sprite();
var title:TextField = new TextField();
title.text = "Hello";
var pict:Loader = new Loader();
var url:URLRequest = new URLRequest("banana.jpg");
pict.load(url);
pict.name = "banana loader";
container.addChild(title);
container.addChild(pict);
getChildAt()
メソッドは、特定のインデックス位置にある表示リストの子を返します。
trace(container.getChildAt(0) is TextField); // true
子オブジェクトに名前でアクセスすることもできます。 表示オブジェクトには name プロパティがあります。name プロパティを割り当てなかった場合は、Flash Player では「
instance1
」などのデフォルト値が割り当てられます。例えば、次のコードは、
getChildByName()
メソッドを使用して「
banana loader
」という名前で子表示オブジェクトにアクセスする方法を示します。
trace(container.getChildByName("banana loader") is Loader); // true
getChildByName()
メソッドを使用すると、
getChildAt()
メソッドを使用するよりパフォーマンスが低下します。
表示オブジェクトコンテナには表示リストの子オブジェクトとして別の表示オブジェクトコンテナを含めることができるため、ツリーのようにアプリケーションの表示リスト内を移動できます。 例えば、前述のコードの抜粋では、
pict
Loader オブジェクトのロード操作が完了すると、
pict
オブジェクトにビットマップである子表示オブジェクトがロードされます。このビットマップ表示オブジェクトにアクセスするために、
pict.getChildAt(0)
を記述することができます。また、
container.getChildAt(0) == pict
であるため、
container.getChildAt(0).getChildAt(0)
を記述することもできます。
次の関数は、表示オブジェクトコンテナから表示リストのインデントされた
trace()
を出力します。
function traceDisplayList(container:DisplayObjectContainer, indentString:String = ""):void
{
var child:DisplayObject;
for (var i:uint=0; i < container.numChildren; i++)
{
child = container.getChildAt(i);
trace(indentString, child, child.name);
if (container.getChildAt(i) is DisplayObjectContainer)
{
traceDisplayList(DisplayObjectContainer(child), indentString + " ")
}
}
}
Adobe Flex
Flex を使用する場合、Flex では数多くのコンポーネント表示オブジェクトクラスが定義され、これらのクラスでは DisplayObjectContainer クラスの表示リストアクセスメソッドがオーバーライドされることに注意してください。例えば、mx.core パッケージの Container クラスでは、
addChild()
メソッドと、Container クラスで拡張される DisplayObjectContainer クラスの他のメソッドがオーバーライドされます。
addChild()
メソッドの場合、クラスによってメソッドがオーバーライドされるときに、Flex で Container インスタンスにすべてのタイプの表示オブジェクトを追加することはできません。この場合、オーバーライドされたメソッドでは、追加する子オブジェクトのタイプを mx.core.UIComponent オブジェクトにする必要があります。