6.2.从显示列表中删除项目

问题
我要从可视化对象列表删除可视化对象,从屏幕上消失。
解决办法
使用DisplayObectContainer类的removeChild( )和removeChildAt( )方法
讨论
6.1节讨论了如何使用addChild( )和addChildAt( ) 方法添加可视化对象到可视化对象列表中。与此相反removeChild( )和removeChildAt( ) 方法删除对象。

removeChild( ) 方法需要一个参数,那就是将要删除的对象引用。如果该对象不是可视化容器中的对象,就会抛出ArgumentError 异常:
+展开
-ActionScript
package {
import flash.display.Sprite;
import flash.text.TextField;
import flash.events.MouseEvent;
public class RemoveChildExample extends Sprite {
private var _label:TextField;
public function RemoveChildExample( ) {
_label = new TextField( );
_label.text = "Some Text";
addChild( _label );
stage.addEventListener( MouseEvent.CLICK, removeLabel );
}
public function removeLabel( event:MouseEvent ):void {
removeChild( _label );
}
}
}

上面的代码创建个本地变量保存TextField的引用,这很必要,因为removeChild( ) 方法需要这个参数,如果没有这个变量,removeChild( )方法就不可用了,这时可以用removeChildAt( ) 方法。

removeChildAt( ) 方法就像addChildAt( ) 方法一样需要一个数字参数,就是对象在队列中的位置,该值的合法范围在0到列表中的子对象数目。如果该值不合法则会抛出RangeError异常,下面的例子使用了removeChildAt( )方法
+展开
-ActionScript
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";
addChild( label );
stage.addEventListener( MouseEvent.CLICK, removeLabel );
}
public function removeLabel( event:MouseEvent ):void {
if ( numChildren > 0 ) {
removeChildAt( 0 );
}
}
}
}

使用removeChildAt( ) 最大的不同就是不再需要先申明TextField 的引用变量了, 在RemoveChildExample 容器中,它被添加到位置0处,要删除它只要指定位置为0,传递0给removeChildAt( )。

注意,从列表中移出并不算完全删除了,要完全删除需要把所有指向它的引用设为null。

如果要移除所有容器中的子对象,把removeChildAt( ) 放在for 循环中,每个容器都有个numChildren 属性表示它所拥有的子对象数目。

当一个子对象被移除,比它高的子对象将会全部下移一位。比如说一个容器有3个子对象他们在0, 1,和2的位置。当在位置0的子对象被移除,其他对象位置自动减1。这里有两种方式移除对象:
总是移除位置0的对象。
移除最上面的对象。
第一种情况,每次移除第一个位置的对象,其他对象下移,接着还是移除第一个位置的对象,循环反复。
第二种情况,移除最后的对象不会导致其他对象重新调整位置。
+展开
-ActionScript
ascb.util.DisplayObjectUtilities 类实现了第一种方式:
package ascb.util {
import flash.display.*;
public class DisplayObjectUtilities {
// 删除所有对象
public static function removeAllChildren(
container:DisplayObjectContainer ):void {
var count:int = container.numChildren;
for ( var i:int = 0; i < count; i++ ) {
container.removeChildAt( 0 );
}
}
}
}

使用DisplayObjectUtilities.removeAllChildren( ) 方法更直接些,看下面:
+展开
-ActionScript
package {
import flash.display.*;
import ascb.util.DisplayObjectUtilities;
public class DisplayListExample extends Sprite {
public function DisplayListExample( ) {
addChild( new Sprite( ) );
addChild( new Sprite( ) );
// 删除所有子对象
DisplayObjectUtilities.removeAllChildren( this );
// 演示所以子对象都被删除了,显示0
trace( numChildren );
}
}
}

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


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