显示列表简介
在 AS3 中,显示资源在添加到显示列表之前不可见。
AIR / Flash 运行时具有分层显示结构(父子关系,其中子项可以有自己的子项),stage
是顶级父项。
要在显示列表中添加内容,请使用 addChild
或 addChildAt
。以下是绘制圆形并将其添加到显示列表的基本示例:
var myCircle:Shape = new Shape();
myCircle.graphics.beginFill(0xFF0000); //red
myCircle.graphics.drawCircle(25, 25, 50);
myCircle.graphics.endFill();
this.addChild(myCircle); //add the circle as a child of `this`
要查看上面示例中的对象,this
(代码的上下文)也必须位于显示列表中,以及它可能具有的任何父级。在 AS3 中,stage
是最顶级的父母。
显示对象只能有一个父对象。因此,如果一个孩子已经有一个父母,并且你将它添加到另一个对象,它将从它的前一个父母中删除。
Z 顺序/分层
假设你复制了上一个示例中的代码,因此你有 3 个圆圈:
var redCircle:Shape = new Shape();
redCircle.graphics.beginFill(0xFF0000); //red
redCircle.graphics.drawCircle(50, 50, 50); //graphics.endFill is not required
var greenCircle:Shape = new Shape();
greenCircle.graphics.beginFill(0x00FF00); //green
greenCircle.graphics.drawCircle(75, 75, 50);
var blueCircle:Shape = new Shape();
blueCircle.graphics.beginFill(0x0000FF); //blue
blueCircle.graphics.drawCircle(100, 100, 50);
this.addChild(redCircle);
this.addChild(greenCircle);
this.addChild(blueCircle);
由于 addChild
方法将子项添加到同一父项中的所有其他项之上,因此你将获得此结果,其中项目的分层顺序与你使用 addChild 的顺序相同:
http://i.stack.imgur.com/VqKme.jpg
如果你想要一个孩子相对于它的兄弟姐妹分层不同,你可以使用 addChildAt
。使用 addChildAt
,你传入另一个参数,该参数指示子项应该处于的索引(z 顺序)。0
是最底层的位置/层。
this.addChild(redCircle);
this.addChild(greenCircle);
this.addChildAt(blueCircle,0); //This will add the blue circle at the bottom
http://i.stack.imgur.com/8GtkC.jpg
现在,蓝色圆圈在它的兄弟姐妹之下。如果稍后,你想要更改子项的索引,则可以使用 setChildIndex
方法(在子项的父项上)。
this.setChildIndex(redCircle, this.numChildren - 1); //since z-index is 0 based, the top most position is amount of children less 1.
这将重新排列红色圆圈,使其高于一切。上面的代码产生与 this.addChild(redCircle)
完全相同的结果。
删除显示对象
要删除对象,你可以使用相反的 removeChild
和 removeChildAt
方法以及 removeChildren
方法。
removeChild(redCircle); //this will take redCircle off the display list
removeChildAt(0); //this will take the bottom most object off the display list
removeChildren(); //this will clear all children from the display list
removeChildren(1); //this would remove all children except the bottom most
removeChildren(1,3); //this would remove the children at indexes 1, 2 & 3
活动
将子项添加到显示列表时,会对该子项触发一些事件。
Event.ADDED
Event.ADDED_TO_STAGE
相反,还有删除事件:
Event.REMOVED
Event.REMOVED_FROM_STAGE
Adobe Animate / Flash Professional
处理 FlashProfessional / Adobe Animate 时间轴时,向时间轴添加内容会自动处理显示列表的细微差别。他们通过时间线自动添加和删除显示列表。
但是,请记住:
如果你通过代码操作由时间轴创建的显示对象的父项(通过使用 addChild / setChildIndex),则该子项将不再由时间轴自动删除,并且需要通过代码删除。