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 {
public class DisplayListExample extends Sprite {
public function DisplayListExample( ) {
var label:TextField = new TextField( );
label.text = "Some Text";
// 把label加入顯示對象清單中
addChild( label );
// 從容器對象清單中移除所有子對象
// 如果子對象存在則移除
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( ) 方法:
import ascb.util.DisplayObjectUtilities;
//增加空的sprite對象
addChild( new Sprite( ) );
// 從這個容器中移除所有的對象
DisplayObjectUtilities.removeAllChildren( this );
// 所有的子對象被移除後該值顯示為0
trace( numChildren );