您的位置:首页 > 其它

ActionScript 3.0 Cookbook 6.2 从显示列表中移除项目(翻译:转载请注明)

2007-08-08 11:33 501 查看
6.2 从显示列表中移除项目(翻译:<ok7758521ok@hotmail.com>转载请注明)
问题:
你要想从显示列表移除项目从而从屏幕中移除
解决方案:
使用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 );
    }
  
  }
}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐