ActionScript 3.0 Cookbook 6.2 从显示列表中移除项目:
ActionScript 3.0 cookbook是进行Flash、Flex以及AIR开发所必需的技术。存储null6.2 从显示列表中移除项目问题:
你要想从显示列表移除项目从而从屏幕中移除
解决方案:
使用DisplayObjectContainer 类的removeChild()和removeChildAt()方法
讨论:
6.1节中已经陈述了如何用addChild()和addChildAt()方法去在显示列表中增加显示对象
达到相反的效果可以用removeChild()和removeChild()方法。
removeChild()方法接收唯一的参数,这个参数就是要从容器对象中要被删除的子对象,
如果假设被删除的对象不是一个容器的子对象,那么将会抛出一个参数异常
package{
import flash.display.Sprite;
import flash.text.TextField;
import flash.events.MouseEvent;
public class RemoveChildExample extends Sprite {
//创建一个本地变量用于存储稍后将被移除的Textfield
private var _label:TextField;
public function RemoveChildExample( ) {
_label = new TextField( );
_label.text = "Some Text";
// 把Textfield对象加入显示对象列表
addChild( _label );
//当鼠标点击舞台的任意位置时标签label被移除
stage.addEventListener( MouseEvent.CLICK, removeLabel );
}
// 从显示对象列表中移除该标签对象
public function removeLabel( event:MouseEvent ):void {
removeChild( _label );
}
}
}
在上面的代码例子中创建一个本地变量label来存储将要被removeChild()删除的对象TextField
如果你不用label存储被删除对象,也可以用removeChildAt()方法代替
removeChildAt()方法的参数也是一个,不过它是容器显示列表孩子对象的索引值。
范围0到numChildren 1. 如果无效的索引(如负数值,或者大于容器子节点数目的值)被指定
那么将抛出异常,将上面的代码用removeChildAt() 方法实现代码如下:
package {
import flash.display.Sprite;
import flash.text.TextField;
import flash.events.MouseEvent;
public class DisplayListExample extends Sprite {
public function DisplayListExample( ) {
var label:TextField = new TextField( );
label.text = "Some Text";
// 把label加入显示对象列表中
addChild( label );
//当鼠标点击舞台的任意位置时标签label被移除
stage.addEventListener( MouseEvent.CLICK, removeLabel );
}
// 从容器对象列表中移除所有子对象
public function removeLabel( event:MouseEvent ):void {
// 如果子对象存在则移除
if ( numChildren > 0 ) {
removeChildAt( 0 );
}
}
}
}
注意:移除子对象并不是完全删除该子对象,而是阻止其显示,如果要完全的删除该对象,要将该对象赋值为null
如果你想删除一个容器的所有的子对象,可以用removeChildAt()和一个循环一起来实现
每一个容器都有一个numChildren属性,这个属性指出该对象有多少个子对象的数目
无论什么时间从子对象列表中移除某一个子象,其他的没有被移除的子对象中位置比它高的都会移动一个位
来屏蔽空隙。比如列表中有三个子对象,分别对应列表中的0,1,2位置,如果0位置的子对象被删除,那么
1位置的子对象会移动到0位置,2位置的的子对象会移动到1位置。
我们推荐使用的第一种方法,是用ascb.util.DisplayObjectUtilities 类
package ascb.util {
import flash.display.*;
public class DisplayObjectUtilities {
// 移除一个容器中所有子对象
public static function removeAllChildren(
container:DisplayObjectContainer ):void {
// 每次移除一个子对象numChildren都会改变
var count:int = container.numChildren;
//通过循环移除子对象
for ( var i:int = 0; i < count; i++ ) {
container.removeChildAt( 0 );
}
}
}
第二中方法,使用DisplayObjectUtilities.removeAllChildren( ) 方法:
package {
import flash.display.*;
import ascb.util.DisplayObjectUtilities;
public class DisplayListExample extends Sprite {
public function DisplayListExample( ) {
//增加空的sprite对象
addChild( new Sprite( ) );
addChild( new Sprite( ) );
// 从这个容器中移除所有的对象
DisplayObjectUtilities.removeAllChildren( this );
// 所有的子对象被移除后该值显示为0
trace( numChildren );
}
}
}