I Love China

技术·人生

技术服务生活
繁體
6月 1st, 2007

[翻译][AS3]display列表的优点

在ActionScript3.0中,不同的display对象是不同的类。在AS1.0和2.0中,这些对象都包含在相同的类中:MovieClip类。
把这些类分离成独立的类的做法以及使用display列表的层次结构具有下列优点:

1、更高效的绘图、更小的文件大小

在ActionScript1.0和2.0中,只能在MovieClip对象中绘制图形。在AS3.0中,有了可以在其中绘制图形的更简单的display对象。由于这些AS3.0的display对象并不包含MovieClip对象的所有属性和方法,所以它们占用更少的内存和处理器资源。
比如每个MovieClip对象都有一个时间轴属性,但是Shape对象就没有。管理时间轴会使用许多内存和处理器资源。在AS3.0中,使用Shape对象会有更好的性能。Shape对象比MovieClip对象的开销更小。Flash Player不需要管理不使用的MovieCilp属性,从而提高了速度并减少了内存使用。

2、改进的深度管理
AS1.0和2.0使用一种线性的深度管理方案和方法管理深度,比如getNextHighestDepth()方法。
AS3.0的DisplayObjectContainer类中有更加方便的方法和属性管理display对象的深度。

在AS3.0中,当你在一个DisplayObjectContainer实例中把一个display对象移动到新的位置时,该实例的所有其他子对象将自动排列,并会给它们分配合适的位置。
另外,在AS3.0中,display对象容器中的所有子对象都可以找出来。每个DisplayObjectContainer实例都有一个名为numChildren的属性,它可以列出子对象的数量。子对象列表是一个索引列表,所以你可以从索引0开始直到最后一个索引位置(numChildren - 1)来遍历所有子对象。但是在AS1.0和2.0中对于MovieClip对象却没有这种功能。
使用AS3.0你可以连续的移动display列表,而不必担心列表中间会产生断链。移动display列表和管理对象深度比在AS1.0和2.0中容易了很多。在AS1.0和2.0中,一个影片剪辑允许某个深度上产生断链,从而使得来回移动对象时变得困难。在AS3.0中,display对象容器使用数组缓存display列表,所以查找起来很迅速。循环遍历列表中的所有子对象也很快。
在AS3.0中,还可以使用DisplayObjectContainer类的getChildByName()方法访问子对象。

3、Full traversal of the display list
在AS1.0和2.0中有些对象是无法访问的,比如在Flash开发工具中创作的矢量图形。在AS3.0中,你可以访问display列表中的所有对象——不管是使用AS创建的还是在开发工具中创建的。

4、Off-list display objects
在AS3.0中,你可以创建一些并不放在显示列表中的display对象。这些被称为off-list display对象。只有当你调用addChild()或者addChildAt()方法时一个display对象才会添加到显示列表中。

你可以使用off-list display对象组建一些复杂的display对象,比如多个display对象容器中含有多个display对象。只要把它们放在off-list中,在加工时就不必处理这些display对象。随时都可以把一个off-list中的对象添加到display列表中。同样,你可以随意的把一个display对象容器移动到你想要的地方。

Easier subclassing of display objects
在AS1.0和2.0中,往SWF中添加图形或者位图就需要创建一个新的MovieClip对象。在AS3.0中,DisplayObject类包含许多内置类,比如Shape和Bitmap。因为AS3.0中的类是细分之后的,所以继承一个子类很容易。
比如,如果要在AS2.0中画一个圆,你可以创建一个继承自MovieClip类的子类CustomCircle类。但是这个类同样拥有了MovieClip的无用属性。在AS3.0中,你可以扩展Shpae对象,就不会继承那么多无用的属性了,下面的代码展示了一个CustomCircle类

ActionScript Code:
  1. import flash.display.*;
  2.  
  3. private class CustomCircle extends Shape
  4. {
  5.     var xPos:Number;
  6.     var yPos:Number;
  7.     var radius:Number;
  8.     var color:uint;
  9.     public function CustomCircle(xInput:Number,
  10.                                         yInput:Number,
  11.                                         rInput:Number,
  12.                                         colorInput:uint)
  13.     {
  14.         xPos = xInput;
  15.         yPos = yInput;
  16.         radius = rInput;
  17.         color = colorInput;
  18.         this.graphics.beginFill(color);
  19.         this.graphics.drawCircle(xPos, yPos, radius);
  20.     }
  21. }

随机文章:

Leave a Reply