6.1.在可视化对象列表中添加项目

问题
我要添加新的可视化对象在屏幕上显示
解决办法
使用DisplayObectContainer类的addChild( ) 和addChildAt( ) 方法
讨论
Flash Player 现在把ActionScript 虚拟机(AVM)和渲染引擎两块功能集成在一起了。AVM 完成执行ActionScript 代码,而渲染引擎负责在屏幕上绘制对象,绘制对象需要两步骤:
通过ActionScript引擎创建可视化对象。
渲染引擎把可视化对象绘制在屏幕上。

第一步用new操作符创建可视化对象实例,任何直接或间接继承自DisplayObject类的实例都可以添加到可视化对象列表中,比如Sprite,MovieClip,TextField,或自定义类。用下列代码创建TextField:
+展开
-ActionScript
var hello:TextField = new TextField( );

上面的代码在AVM中创建了一个TextField display 对象,但是该对象没有绘制在屏幕上,因为它还不存在于渲染引擎里,要把它放到渲染引擎里需要添加该对象到可视化对象列表,通过调用DisplayObjectContainer实例的addChild( )或addChildAt( ) 方法添加。
addChild( ) 方法接受一个参数,就是要显示的对象,下面的代码演示如何在AVM中创建对象,然后通过渲染引擎显示它:
+展开
-ActionScript
package {
import flash.display.DisplayObjectContainer;
import flash.display.Sprite;
import flash.text.TextField;
public class DisplayListExample extends Sprite {
public function DisplayListExample( ) {
// 创建对象
var hello:TextField = new TextField( );
hello.text = "hello";
//显示对象
addChild( hello );
}

}
}

这里DisplayListExample 类是.swf 电影的主类, 它继承自Sprite 类。因此也间接继承自DisplayObjectContainer,它允许使用addChild( ) 方法添加对象作为其子对象。

TextField 对象通过DisplayListExample 构造函数创建,它是在AVM中创建,这时该对象不会立即显示在屏幕上因为渲染引擎还不知道它呢,只有通过addChild( )添加它到可视化对象列表中TextField 才被显示。

addChild( )和addChildAt( ) 方法把添加的对象作为可视化对象容器的子对象。

下面的代码演示addChild( ) 方法把对象添加到容器上而不是添加到可视化列表,因为容器对象不在可视化列表里,所以这个文本是不可见的:
+展开
-ActionScript
// 创建文本框显示文本
var hello:TextField = new TextField( );
hello.text = "hello";
// 创建容器
var container:Sprite = new Sprite( );
// 添加TextField 作为容器的子对象
container.addChild( hello );

要显示文本,需要把container 添加到可视化对象列表中。通过列表的引用如root或stage,调用其addChild( ),container 作为该方法的参数,root 和stage 都是DisplayObject 类的属性:
+展开
-ActionScript
DisplayObjectContainer( root ).addChild( container );

可视化对象容器能容纳多个子对象,并且管理着对象列表的排列顺序,这个顺序决定这些对象显示在屏幕上的顺序。每个子对象在列表中都有个位置,它用一个整数来索引,这很像数组,位置0代表在列表的底层,它在位置1下绘制,位置1在位置2下绘制,依次类推,如果以前编写过Flash程序,这个深度概念是很容易理解的。

当通过addChild( ) 方法添加的对象会显示在最顶层,也就是它得到最大的位置索引值,如果要自己指定位置可使用addChildAt( ) 方法。

addChildAt( )方法需要两个参数:要显示的对象,和队列位置。如果指定为0则会显示在最底下,如果指定为某个对象的后面,则它前面的对象都要向前移动,如果指定非法值比如负数或很大的数,就会抛出RangeError 错误。

下面的例子创建三个不同颜色的圆,红色和蓝色的圆通过addChild( ) 方法添加,蓝色的在前,因为它比红色迟些加入的,现在红色圆的位置为0,蓝色的为1。绿色的圆要通过addChildAt( ) 方法查到红色和蓝色之间,指定位置为1,这时蓝色的位置前移变成2。最后的顺序为红色为0,绿色为1,蓝色为2:
+展开
-ActionScript
package {
import flash.display.*;

public class CircleExample extends Sprite {
public function CircleExample( ) {
var red:Shape = createCircle( 0xFF0000, 10 );
red.x = 10;
red.y = 20;
var green:Shape = createCircle( 0x00FF00, 10 );
green.x = 15;
green.y = 25;
var blue:Shape = createCircle( 0x0000FF, 10 );
blue.x = 20;
blue.y = 20;
addChild( red );
addChild( blue );
addChildAt( green, 1 );
}
public function createCircle( color:uint, radius:Number ):Shape {
var shape:Shape = new Shape( );
shape.graphics.beginFill( color );
shape.graphics.drawCircle( 0, 0, radius );
shape.graphics.endFill( );
return shape;
}
}
}

现在我们只讨论了如何添加,那么当重复添加同一个对象会发生什么事呢?这时,它会先删除原来已经添加的对象,然后再把对象添加进去。

下面的例子演示:一个容器被创建来显示红色,绿色和蓝色圆,然后容器被添加到显示列表中。另一个容器创建添加到显示列表中,把红色圆移到第2个容器上,因此第2个容器显示在第1个上面,所以红色圆显示在最上面。
+展开
-ActionScript
package {
import flash.display.*;
public class DisplayListExample extends Sprite {

public function DisplayListExample( ) {
var red:Shape = createCircle( 0xFF0000, 10 );
red.x = 10;
red.y = 20;
var green:Shape = createCircle( 0x00FF00, 10 );
green.x = 15;
green.y = 25;
var blue:Shape = createCircle( 0x0000FF, 10 );
blue.x = 20;
blue.y = 20;
var container1:Sprite = new Sprite( );
container1.addChild( red );
container1.addChild( green );
container1.addChild( blue );
addChild( container1 );
var container2:Sprite = new Sprite( );
addChild( container2 );
container2.addChild( red );
}
public function createCircle( color:uint, radius:Number ):Shape {
var shape:Shape = new Shape( );
shape.graphics.beginFill( color );
shape.graphics.drawCircle( 0, 0, radius );
shape.graphics.endFill( );
return shape;
}
}
}

加支付宝好友偷能量挖...


评论(0)网络
阅读(77)喜欢(0)flash/flex/fcs/AIR