显示列表简介

在 AS3 中,显示资源在添加到显示列表之前不可见。

AIR / Flash 运行时具有分层显示结构(父子关系,其中子项可以有自己的子项),stage 是顶级父项。

要在显示列表中添加内容,请使用 addChildaddChildAt。以下是绘制圆形并将其添加到显示列表的基本示例:

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) 完全相同的结果。

删除显示对象

要删除对象,你可以使用相反的 removeChildremoveChildAt 方法以及 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 / Adob​​e Animate 时间轴时,向时间轴添加内容会自动处理显示列表的细微差别。他们通过时间线自动添加和删除显示列表。

但是,请记住:

如果你通过代码操作由时间轴创建的显示对象的父项(通过使用 addChild / setChildIndex),则该子项将不再由时间轴自动删除,并且需要通过代码删除。