使用显示列表

所有 ActionScript 3.0 组件均继承自 DisplayObject 类,因此,它们均有权访问该类的方法和属性以与显示列表交互。“显示列表”是应用程序中所显示对象和可视元素的层次结构。此层次结构包含以下元素:

  • 舞台,它是顶层容器

  • 显示对象,包括形状、影片剪辑、文本字段以及其他

  • 显示对象容器,即可以包含子显示对象的特殊类型的显示对象。

显示列表中对象的顺序决定了这些对象在父容器中的深度。对象的深度是指它在舞台上或在其显示容器中从上到下或从前到后来看的位置。对象重叠时,深度的顺序很明显;但即使对象不重叠,深度顺序也存在。显示列表中的每个对象在舞台上都有对应的深度。如果要通过将对象放置在其他对象的前面或移动到其他对象的后面来更改该对象的深度,则需要更改该对象在显示列表中的位置。对象在显示列表中的默认顺序是将它们放置在舞台上的顺序。位于显示列表中位置 0 处的对象是在深度顺序中处于最底部的对象。

向显示列表添加组件

通过调用 DisplayObjectContainer 容器的 addChild() addChildAt() 方法,可以向该容器添加对象。对于舞台,在创作过程中还可以通过创建对象来向其显示列表添加对象;对于组件,则可以通过将组件从“组件”面板中拖到舞台上来向其显示列表添加对象。若要使用 ActionScript 向容器添加对象,首先要通过使用 new 运算符调用对象的构造函数来创建该对象的一个实例,然后再调用 addChild() addChildAt() 方法将它放置到舞台上或显示列表中。 addChild() 方法将该对象放置到显示列表中的下一位置,而 addChildAt() 则指定该对象将要添加到的位置。如果您指定的位置已经被占用,则位于该位置以及该位置之上的对象均会向上移动 1 个位置。DisplayObjectContainer 对象的 numChildren 属性指定了它包含的显示对象的数目。可以通过调用 getChildAt() 方法并指定位置来检索显示列表中的对象,如果您知道对象的名称,也可以通过调用 getChildByName() 方法来检索对象。

注: 使用 ActionScript 添加组件时,如果要通过名称在显示列表中访问该组件,您必须为该组件的 name 属性分配一个名称。

下面的示例列出了显示列表中三个组件的名称和位置。首先,将一个 NumericStepper、一个 Button 和一个 ComboBox 拖到舞台上,使它们相互重叠,并为它们分别指定实例名称 aNs aButton aCb 。然后将以下代码添加到时间轴第 1 帧的“动作”面板中:

var i:int = 0; 
while(i < numChildren) { 
    trace(getChildAt(i).name + " is at position: " + i++); 
}

在“输出”面板中应看到以下行:

aNs is at position: 0 
aButton is at position: 1 
aCb is at position: 2

移动显示列表中的组件

通过调用 addChildAt() 方法并提供对象名称和您要将该对象放置到的位置作为该方法的参数,可以更改该对象在显示列表中的位置和显示深度。例如,将下面的代码添加到上一示例中可将 NumericStepper 放在顶部,重复执行此循环可显示这些组件在显示列表中的新位置:

this.addChildAt(aNs, numChildren - 1); 
i = 0; 
while(i < numChildren) { 
    trace(getChildAt(i).name + " is at position: " + i++); 
}

在“输出”面板中应看到以下内容:

aNs is at position: 0 
aButton is at position: 1 
aCb is at position: 2 
aButton is at position: 0 
aCb is at position: 1 
aNs is at position: 2

NumericStepper 还应显示在屏幕中其他组件的前面。

请注意, numChildren 是显示列表中对象的数目(从 1 到 n ),而该列表中的第一个位置为 0。因此,如果该列表中有三个对象,则第三个对象的索引位置为 2。这意味着您可以用 numChildren - 1 引用显示列表中的最后一个位置(对于显示深度而言,则是引用顶层对象)。

从显示列表中删除组件

可以使用 removeChild() removeChildAt() 方法将组件从显示对象容器及其显示列表中删除。下面的示例将三个 Button 组件在舞台上依次放到另一个的前面,并为每个组件都添加一个事件侦听器。单击每个 Button 时,事件处理函数会将其从显示列表和舞台上删除。

  1. 创建一个新的 Flash 文件 (ActionScript 3.0) 文档。

  2. 将一个 Button 从“组件”面板拖到“库”面板上。

  3. 打开“动作”面板,在主时间轴中选择第 1 帧,然后添加以下代码:

    import fl.controls.Button; 
     
    var i:int = 0; 
    while(i++ < 3) { 
        makeButton(i); 
    } 
    function removeButton(event:MouseEvent):void { 
        removeChildAt(numChildren -1); 
    } 
    function makeButton(num) { 
        var aButton:Button = new Button(); 
        aButton.name = "Button" + num; 
        aButton.label = aButton.name; 
        aButton.move(200, 200); 
        addChild(aButton); 
        aButton.addEventListener(MouseEvent.CLICK, removeButton); 
    }

    有关显示列表的完整说明,请参阅《ActionScript 3.0 编程》中的“显示编程”。