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 );

  }

  }

  }