2009-02-27 5 views
1

Flash CS4では、フォトギャラリーを作成しています。私の目標は、いくつかの画像から異なるサムネイルを読み込むことです。画像をクリックするとサムネイルの数が表示されますが、別の画像をクリックすると新しいサムネイルが古いサムネイルの上に表示されます。誰かが古いサムネイルを取り除く方法を教えてくれますか?ここでAS3以前のローダーを削除するには

は、コードは次のとおりです。

for (var i:int = 0; i < thumbnails.length(); i++) { 
    imgLoader.unload(); 
    imgLoader = new Loader(); 
    imgLoader.load(new URLRequest(thumbnails[i])); 
    imgLoader.name= i; 
    imgLoader.x = 95 * columns; 
    imgLoader.y = 80 * rows; 
    imgLoader.alpha = 0; 
    details.gallery.addChild(imgLoader); 

    if (columns+1< 5) { 
    columns++; 
    } else { 
    columns = 0; 
    rows++; 
    } 
} 

答えて

2

これは、Arrayがあなたの友人であるところです。あなたは単に配列を使わずに、whileループを使って、スプライトまたは親指を追加したムービークリップからすべての最後の子を削除するだけで済みます。配列を使用する理由は、サムを単に再表示するのではなく、表示リストから削除するだけです。表示リストに追加するごとに、各オブジェクトの参照を各サムの配列にプッシュします。 XMLの各thumbContainerノードは、メイン配列に追加される独自の配列を取得します。メイン配列は、サムネイル配列への参照を保持します。サムネイル配列は、ロードされたサムネイルへの参照を保持するため、表示リストに追加したり削除したりすることができます。親指を一度見た後に親指を絶対に使用する予定がない場合は、参照をnullに設定することもできます。そうでなければ、単に表示リストから削除するだけです。何度もロードする必要はありません。新しい親指を追加する準備ができたら、前の親指を削除する必要があります。これを行う最も簡単な方法はwhileループです。

//Assuming the thumbs were loaded into container 
while(container.numChildren > 0) 
{ 
    //Remove the first child until there are none. 
    container.removeChildAt(0); 
} 

//The XML/2 Containers/thumbContainer[0] and thumbContainer[1] 

<?xml version="1.0" encoding="utf-8"?> 
<xml> 
    <thumbContainer> 
     <thumb path="path/to/file" /> 
     <thumb path="path/to/file" /> 
     <thumb path="path/to/file" /> 
    </thumbContainer> 
    <thumbContainer> 
     <thumb path="path/to/file" /> 
     <thumb path="path/to/file" /> 
     <thumb path="path/to/file" /> 
    </thumbContainer> 
</xml> 

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.MouseEvent; 
    import flash.net.URLLoader; 
    import flash.net.URLRequest; 

    public class DocumentClass extends Sprite 
    { 
     private var _container:Sprite; 
     private var _mainArray:Array; 
     private var _xml:XML; 
     private var _urlLoader:URLLoader; 
     private var _urlRequest:URLRequest; 

     public function DocumentClass():void 
     { 
      if(stage) _init(); 
      else addEventListener(Event.ADD_TO_STAGE, _init, false, 0 , true); 
     } 
     private function _init(e:Event = null):void 
     { 
      //Will contain arrays for each thumbContainer in the XML. 
      _mainArray = []; 

      _urlRequest = new URLRequest('path/to/xml'); 
      _urlLoader = new URLLoader(); 
      _urlLoader.addEventListener(Event.COMPLETE, _onXMLComplete, false, 0, true);  
     } 
     private function _onXMLComplete(e:Event):void 
     { 
      _xml = new XML(e.target.data); 

      _loadThumbs(0); 
     } 
     private function _loadThumbs(pIndex:int):void 
     { 
      _clearThumbs(); 

      //Find out how many sets of thumbs there and add to _mainArray 
      for(var i:int = 0; i < _xml.thumbContainer.length(); i++) 
      { 
       var tempArray:Array = new Array(); 

       for(var j:int = 0; j < _xml.thumbContainer[i].thumb.length; j++) 
       { 
        tempArray[i].push(_xml.thumbContainer[i].thumb[j][email protected]); 
       } 
       _mainArray.push(tempArray); 
      } 


      //Here is where we add the new content to container, or you can call a function to do it. 
     } 
     private function _clearThumbs():void 
     { 
      while(container.numChildren > 0) 
      { 
       //Remove the first child until there are none. 
       container.removeChildAt(0); 
      } 
     } 
    } 
} 

ここでも、再利用可能である何かへの参照を保持するために、単純代わりにnullに設定すると、表示リストから削除するには良い方法ですガベージコレクションのみを後で再度ロードするための準備をします。私は既に私が意図した以上のものを書いていて、私が望むすべてのコードで叩きつけることができませんでした。特定のサムセットを一度ロードするようにするコードを設定することは重要です。それが全体のアイデアです。それらを削除するには、私があなたに示したwhileループと同じくらい簡単ですが、親であるDisplayObjectContainerの名前を知る必要があります。

+0

私はひとつだけ言うことができます。うわー! このレッスンは大変ありがとうございます。 WOW !!! –

0

あなたがにaddChild()メソッドを経由してあなたのギャラリーオブジェクトに新しいサムネイルを追加しているので、あなたは新しいものを追加する前に、ギャラリーからすべてのサムネイルを削除するメソッドを呼び出す必要があります。

+0

を私がしようとしているが、私はエラーのすべての種類を取得しています。例を投げる方法があれば? –

0

私はあなたが使用する必要がremoveChild()だと思う。

私はずっと前にこれでいくつかの非常に奇妙な問題を抱え、あらゆる種類の狂ったヒットコリジョンを引き起こしました。私の解決策は、削除したいオブジェクトのremoveChild()を呼び出して、それを "null"に設定することでした。これに先立って、オブジェクトがnullであるかどうかを確認しました(nullのremoveChildはできません)。

私は自分でActionscriptのシーンにかなり初心者であるので、これを "どのように"行うべきかを保証できません。それがあなたの問題を解決することを願っています。

0

オブジェクトをdetails.gallery.removeChild(オブジェクト)に渡すか、details.gallery.removeChildAt(インデックス)を使用してインデックスを削除することで削除できます。 removeChild()を使用する場合は、必ずnullをチェックするか、エラーをスローします。

フラッシュヘルプファイルを必ず確認してください。これらのファイルは、あなたが使用できる最も優れたリソースです。

0

これはgalleryと呼ばれるムービークリップ内のすべての子供たちを削除します:

while(gallery.numChildren > 0) { gallery.removeChildAt(0); }; 
関連する問題