显示列表方法的优点

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

在 ActionScript 3.0 中,不同类型的显示对象有不同的类。在 ActionScript 1.0 和 2.0 中,很多相同类型的对象都包括在一个类(即 MovieClip 类)中。

类的这种个性化处理方式和显示列表的分层次结构具有下列优点:

  • 呈示方式更为有效且减少了内存使用

  • 改进了深度管理

  • 完整遍历显示列表

  • 列表外的显示对象

  • 更便于创建显示对象的子类

呈示方式更为有效且文件较小

在 ActionScript 1.0 和 2.0 中,只可以在 MovieClip 对象中绘制形状。在 ActionScript 3.0 中,提供了可在其中绘制形状的更简单的显示对象类。由于这些 ActionScript 3.0 显示对象类并不包括 MovieClip 对象中包含的全部方法和属性,因此给内存和处理器资源造成的负担比较小。

例如,每个 MovieClip 对象都包括用于影片剪辑时间轴的属性,而 Shape 对象则不包括。用于管理时间轴的属性会使用大量的内存和处理器资源。在 ActionScript 3.0 中,使用 Shape 对象可提高性能。与更复杂的 MovieClip 对象相比,Shape 对象的开销更少。Flash Player 和 AIR 并不需要管理未使用的 MovieClip 属性,因此提高了速度,还减少了对象使用的内存空间。

改进了深度管理

在 ActionScript 1.0 和 2.0 中,通过线性深度管理方案和方法(如 getNextHighestDepth())进行深度管理。

在 ActionScript 3.0 中提供了 DisplayObjectContainer 类,该类提供用于管理显示对象深度的更便捷的方法和属性。

在 ActionScript 3.0 中,当您将显示对象移到 DisplayObjectContainer 实例的子级列表中的新位置时,显示对象容器中的其他子级会自动重新定位并在显示对象容器中分配相应的子索引位置。

此外,在 ActionScript 3.0 中,总是可以发现任何显示对象容器中的所有子对象。每个 DisplayObjectContainer 实例都有 numChildren 属性,用于列出显示对象容器中的子级数。由于显示对象容器的子级列表始终是索引列表,因此可以检查列表中从索引位置 0 到最后一个索引位置 (numChildren - 1) 的所有对象。这不适用于 ActionScript 1.0 和 2.0 中 MovieClip 对象的方法和属性。

在 ActionScript 3.0 中,可以按顺序轻松遍历显示列表;显示对象容器子级列表的索引编号没有中断。遍历显示列表和管理对象深度比在 ActionScript 1.0 和 2.0 中更容易。在 ActionScript 1.0 和 2.0 中,影片剪辑可以包含深度顺序有间歇中断的对象,这可能导致难以遍历对象列表。在 ActionScript 3.0 中,显示对象容器的每个子级列表都在内部缓存为一个数组,这样按索引查找的速度就非常快。遍历显示对象容器所有子级的速度也非常快。

在 ActionScript 3.0 中,还可以通过使用 DisplayObjectContainer 类的 getChildByName() 方法来访问显示对象容器中的子级。

完整遍历显示列表

在 ActionScript 1.0 和 2.0 中,无法访问在 Flash 创作工具中绘制的某些对象(如矢量形状)。在 ActionScript 3.0 中,可以访问显示列表中的所有对象,包括使用 ActionScript 创建的对象以及在 Flash 创作工具中创建的所有显示对象。有关详细信息,请参阅遍历显示列表

列表外的显示对象

在 ActionScript 3.0 中,可以创建不在可视显示列表中的显示对象。这些对象称为“列表外”显示对象。仅当调用已添加到显示列表中的 DisplayObjectContainer 实例的 addChild()addChildAt() 方法时,才会将显示对象添加到可视显示列表中。

可以使用列表外的显示对象来组合复杂的显示对象,如有多个显示对象容器(包含多个显示对象)的那些对象。通过将显示对象放在列表外,可以组合复杂的对象,而不需要占用处理时间来呈示这些显示对象。然后在需要时可以在显示列表中添加列表外的显示对象。此外,可以随意将显示对象容器的子级移入和移出显示列表以及移到显示列表中的任何需要位置。

更便于创建显示对象的子类

在 ActionScript 1.0 和 2.0 中,通常必须在 SWF 文件中添加新的 MovieClip 对象才能创建基本形状或显示位图。在 ActionScript 3.0 中,DisplayObject 类包括许多内置子类,包括 Shape 和 Bitmap。由于 ActionScript 3.0 中的类更专用于特定类型的对象,因此更易于创建内置类的基本子类。

例如,要在 ActionScript 2.0 中绘制一个圆,可以在实例化自定义类的对象时创建用于扩展 MovieClip 类的 CustomCircle 类。但是,该类还另外包括 MovieClip 类中不应用于该类的许多属性和方法(如 totalFrames)。但在 ActionScript 3.0 中,可以创建用于扩展 Shape 对象的 CustomCircle 类,但该类不包括 MovieClip 类中包含的不相关的属性和方法。下面的代码显示了 CustomCircle 类的一个示例:

import flash.display.*; 
 
public class CustomCircle extends Shape 
{ 
    var xPos:Number; 
    var yPos:Number; 
    var radius:Number; 
    var color:uint; 
    public function CustomCircle(xInput:Number,  
                                        yInput:Number,  
                                        rInput:Number,  
                                        colorInput:uint) 
    { 
        xPos = xInput; 
        yPos = yInput; 
        radius = rInput; 
        color = colorInput; 
        this.graphics.beginFill(color); 
        this.graphics.drawCircle(xPos, yPos, radius); 
    } 
}