表示リスト内の移動

Flash Player 9 以降、Adobe AIR 1.0 以降

既に見たように、表示リストはツリー構造です。ツリーの一番上には、複数の表示オブジェクトを含めることができるステージがあります。 これらの表示オブジェクトは、それ自体が表示オブジェクトコンテナであり、別の表示オブジェクト、つまり表示オブジェクトコンテナを含めることができます。

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 オブジェクトにする必要があります。