使用显示对象容器

Flash Player 9 和更高版本,Adobe AIR 1.0 和更高版本

如果从显示列表中删除某个 DisplayObjectContainer 对象,或者以其他某种方式移动该对象或对其进行变形处理,则会同时删除、移动 DisplayObjectContainer 中的每个显示对象或对其进行变形处理。

显示对象容器本身就是一种显示对象,它可以添加到其他显示对象容器中。例如,下图显示的是显示对象容器 pictureScreen ,它包含一个轮廓形状和四个其他显示对象容器(类型为 PictureFrame):

查看完全大小图形
A.
定义 pictureScreen 显示对象容器边框的形状

B.
作为 pictureScreen 对象的子级的四个显示对象容器

要使某一显示对象出现在显示列表中,必须将该显示对象添加到显示列表上的显示对象容器中。使用容器对象的 addChild() 方法或 addChildAt() 方法可执行此操作。例如,如果下面的代码没有最后一行,将不会显示 myTextField 对象:

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

在此代码范例中, this.root 指向包含该代码的 MovieClip 显示对象容器。在实际代码中,可以指定其他容器。

使用 addChildAt() 方法可将子级添加到显示对象容器的子级列表中的特定位置。子级列表中这些从 0 开始的索引位置与显示对象的分层(从前到后顺序)有关。例如,请考虑下列三个显示对象。每个对象都是从称为 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_A 从它在 container 的显示列表中的位置删除,然后将它重新添加到列表的顶部,最终的结果是将它移到堆栈的顶部。

可以使用 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 类还定义了用于使用子显示对象的几个方法,其中包括:

  • contains() :确定显示对象是否是 DisplayObjectContainer 的子级。

  • getChildByName() :按名称检索显示对象。

  • getChildIndex() :返回显示对象的索引位置。

  • setChildIndex() :更改子显示对象的位置。

  • removeChildren() :删除多个子显示对象。

  • swapChildren() :交换两个显示对象的前后顺序。

  • swapChildrenAt() :交换两个显示对象的前后顺序(由其索引值指定)。

有关详细信息,请参阅 用于 Adobe Flash Platform 的 ActionScript 3.0 参考 中的相关条目。

回想一下,不在显示列表中的显示对象(即不包括在作为舞台子级的显示对象容器中的显示对象)称为“列表外”显示对象。