处理显示对象容器

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

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


有四个用户界面窗口的一幅图像,各窗口是相同的,只是包含不同水果(香蕉、梨、桔子和苹果)图像。

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

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

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

使用 addChildAt() 方法可将子级添加到显示对象容器的子级列表中的特定位置。子级列表中这些从 0 开始的索引位置与显示对象的分层(从前到后顺序)有关。例如,请考虑下列三个显示对象。每个对象都是从称为 Ball 的自定义类创建的。


表示显示对象的三个黄色圆。它们水平排成一行,没有重叠,且从左到右标记为“a”、“b”和“c”

使用 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 对象中的定位如下所示。请注意对象的分层。


代码运行后相同的 3 个圆。“b”与“a”的右边缘重叠。“c”与“a”的右下部重叠,且左下部与“b”重叠。

要重新将对象定位到显示列表的顶部,只需重新将其添加到列表中。例如,在前面的代码后,要将 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); // 文本 2
trace(container2.numChildren); // 1
trace(container2.getChildAt(0).name); // 文本 1

如果将在第一个显示对象容器中包含的某一显示对象添加到另一个显示对象容器中,则会从第一个显示对象容器的子级列表中删除该显示对象。

除了上面介绍的方法之外,DisplayObjectContainer 类还定义了用于处理子显示对象的几个方法,其中包括:

有关详细信息,请参阅《ActionScript 3.0 语言和组件参考》中的相关条目。

注意,不在显示列表中的显示对象(也就是不包括在舞台子级的显示对象容器中的显示对象)被称为“列表外”的显示对象。


Flash CS3

 

评论添加到页面后给我发送电子邮件 | 评论报告

当前页: http://livedocs.adobe.com/flash/9.0_cn/main/00000148.html