I Love China

技术·人生

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

[翻译][AS3]使用display对象

DisplayObject类的属性和方法
所有的display对象都是DisplayObject类的子类,因此它们都继承了DisplayObject类的属性和方法。继承的这些属性都是应用到各个display对象上面的基本属性。比如,每个dispay对象都有x和y属性,这两个属性用来确定该对象在display对象容器中的位置。
不能使用DisplayObject类的构造函数直接创建DisplayObject的实例。你必须使用new操作符创建另外类型的对象(DisplayObject类的子类对象),例如一个Sprite。同样的,如果你想创建一个自定义的display对象类,那么你的类必须是继承自display对象的某一个子类(比如Shape类或Sprite类)。

把display对象添加到display列表中
实例化一个display对象后,在你把它添加到一个位于display列表的display对象容器中之前,它不会显示在屏幕上。比如,在下面的代码中,如果你省略了最后一行代码,那么myText文本框就不会显示出来。最后一行代码中的this关键字必须指向已经添加到display列表中的display对象容器。

ActionScript Code:
  1. import flash.display.*;
  2. import flash.text.TextField;
  3. var myText:TextField = new TextField();
  4. myText.text = "Buenos dias.";
  5. this.addChild(myText);

当你把一些可视的元素添加到Stage上时,这些元素就成了Stage对象的子对象。加载到应用程序(比如内嵌到网页中)中的第一个SWF文件自动添加为Stage的一个子对象。它可以是继承自Sprite类的任何类型的对象。

对于那些不是使用ActionScript创建的display对象——比如在Adobe Flex Builder2中使用MXML标签,或者在Flash中直接放置到舞台上——直接放置在display列表中。尽管你没有使用AcitionScript代码添加,依然可以使用ActionScript访问它们。比如,在创作工具中创建一个名为button1的对象(不是通过ActionScript创建的),下面的代码调整它的宽度:

ActionScript Code:
  1. button1.width = 200;

使用display对象容器
如果把一个displayObjectContainer对象从display列表中删除,或者使用某些方法移动它、转换它,那么这个DisplayObjectContainer中的每一个display对象都会被删除、移动或者转换。

一个display对象容器本身也是一个display对象,所以它可以被添加到其他display对象容器中去。比如,下面的图片展示了一个名为pictureScreen的display对象容器中包含了一个图形轮廓和4个类型为PictureFrame的display对象容器。

fruitGallery
为了使一个display对象出现在displa列表中,你必须把它添加到一个位于display列表中的display对象容器里。可以通过调用该display对象容器的addChild()或者addChildAt()来达到这个目的。比如,下面的代码中如果没有最后一行代码,myTextField对象就不会被显示:

ActionScript Code:
  1. var myTextField:TextField = new TextField();
  2. myTextField.text = "hello";
  3. this.root.addChild(myTextField);

在这段代码中,this.root指向包含这段代码的影片剪辑display对象容器。
使用addChildAt()方法可以把子对象添加到display对象的子对象列表的指定的位置。子对象列表中从0开始索引的位置设计到display对象的排列层叠。每个对象都是由名为Ball的自定义类创建。
DisplayObjectContainer_layers-1
可以使用addChildAt()方法调整容器中display对象的层叠排列,比如,考虑下面的代码:

ActionScript Code:
  1. ball_A = new Ball(0xFFCC00, "a");
  2. ball_A.name = "ball_A";
  3. ball_A.x = 20;
  4. ball_A.y = 20;
  5. container.addChild(ball_A);
  6.  
  7. ball_B = new Ball(0xFFCC00, "b");
  8. ball_B.name = "ball_B";
  9. ball_B.x = 70;
  10. ball_B.y = 20;
  11. container.addChild(ball_B);
  12.  
  13. ball_C = new Ball(0xFFCC00, "c");
  14. ball_C.name = "ball_C";
  15. ball_C.x = 40;
  16. ball_C.y = 60;
  17. container.addChildAt(ball_C, 1);

运行这段代码后,这些display对象将按下图所示进行放置,注意它们的层级:
DisplayObjectContainer_layers-2
如果想把某个对象移到display列表的最顶层,只要重新添加它就可以了。比如,在前面代码的基础上,使用下面的代码就可以把ball_A移到堆栈的顶端:

ActionScript Code:
  1. container.addChild(ball_A);

这段代码有效的把ball_A从容器的display列表中移除掉,然后再添加到列表的顶部——从而实现了把它移到堆栈顶部的目的。
可以使用getChildAt()方法检查display对象的层级顺序。getChildAt()方法以把传递的数据作为索引,返回容器中该索引处的对象。比如下面的例子显示了DisplayObjectContainer对象中不同位置处的对象的名字:

ActionScript Code:
  1. trace(container.getChildAt(0).name); // ball_A
  2. trace(container.getChildAt(1).name); // ball_C
  3. trace(container.getChildAt(2).name); // ball_B

如果把从子对象列表中删除一个对象,那么所有索引位置比它高的都下移一位。比如,继续前面的代码,下面的代码展示了当底层的对象被移除后,位置2的对象会移动到位置1处:

ActionScript Code:
  1. container.removeChild(ball_C);
  2. trace(container.getChildAt(0).name); // ball_A
  3. trace(container.getChildAt(1).name); // ball_B

removeChild()和removeChildAt()方法并不完全的删除一个display对象。仅仅是把这个对象从容器列表中删掉了而已。这个实例仍然可以使用其他变脸来引用。(使用delete操作符会完全的删掉一个对象)
因为一个display对象只能有一个父容器,所以只能把一个display对象实例添加到一个容器中。比如,下面的代码显示了tf1对象只能存在与一个容器中(在这个例子中,就是存在与继承自DisplayObjectContainer类的Sprite):

ActionScript Code:
  1. tf1:TextField = new TextField();
  2. tf2:TextField = new TextField();
  3. tf1.name = "text 1";
  4. tf2.name = "text 2";
  5.  
  6. container1:Sprite = new Sprite();
  7. container2:Sprite = new Sprite();
  8.  
  9. container1.addChild(tf1);
  10. container1.addChild(tf2);
  11. container2.addChild(tf1);
  12.  
  13. trace(container1.numChildren); // 1
  14. trace(container1.getChildAt(0).name); // text 2
  15. trace(container2.numChildren); // 1
  16. trace(container2.getChildAt(0).name); // text 1

如果你把位于一个容器显示列表中的对象添加到另一个容器显示列表中,那么它会从第一个容器显示列表中删除掉。
除了上面介绍的方法,DisplayObjectContainer类还定义了其他几个使用子显示对象的方法:

contains(): 判断一个display对象是不是一个DisplayObjectContainer的子对象.
getChildByName(): 通过名字获取一个display对象.
getChildIndex():返回一个display对象的索引位置.
setChildIndex(): 改变一个子display对象的位置。
swapChildren(): 交换两个display对象的顺序。
swapChildrenAt(): 使用索引值交换两个display对象。

随机文章:

Leave a Reply