2009-02-27 4 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

Здесь находится Массив - ваш друг. Вы можете сделать это без массива, просто используя цикл while, чтобы удалить каждый последний ребенок из спрайта или мувиклипа, к которому вы добавили большие пальцы. Причина, по которой мы используем массивы, состоит в том, чтобы мы могли повторно использовать большие пальцы, вместо того, чтобы перезагружать их, мы просто удаляем их из списка отображения. Вы добавляете ссылку на каждый объект в массив для каждого большого пальца, когда вы добавляете его в список отображения. Каждый узел thumbContainer в XML получает свой собственный массив, который добавляется в основной массив. Основной массив содержит ссылки на миниатюрные массивы. В миниатюрных массивах хранятся ссылки на загруженные миниатюры, чтобы их можно было добавлять и удалять из списка отображения. Если вы планируете никогда не использовать большие пальцы после того, как они были замечены, как только вы можете установить, что эта ссылка равна нулю, в противном случае просто удалите ее из списка отображения; Нет причин многократно загружать его. Когда вы будете готовы добавить новые большие пальцы, вы должны очистить предыдущие большие пальцы. Самый простой способ сделать это - это цикл 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); 
      } 
     } 
    } 
} 

Опять же, это хорошая практика, чтобы содержать ссылку на то, что является многоразовым и просто удалить его из списка отображения вместо установки на нуль и подготовка к сборке мусора только для последующей загрузки. Я уже написал больше, чем планировал, и не смог пощекотать весь код, который я хотел. Важно настроить код, который гарантирует, что он загружает только определенный набор палец один раз; В этом вся идея. Что касается их удаления, это так же просто, как цикл while, который я вам показал, вам просто нужно знать имя DisplayObjectContainer, которое их родит.

+0

Могу только сказать одно. ВАУ! Благодарим вас за этот урок. WOW !!! –

0

Вы добавляете новые эскизы в галерее объект через AddChild() методу, так что вы должны вызвать метод, который удаляет все эскизы из галереи, прежде чем добавлять новые.

+0

Я пытаюсь, но я получаю все виды ошибок. Если есть способ, вы можете привести пример? –

0

Я считаю, что removeChild() вы должны использовать.

У меня были некоторые очень странные проблемы с этим недавно, что вызвало всевозможные сумасшедшие столкновения ударов, а что нет. Мое решение заключалось в том, чтобы вызвать removeChild() для объекта, который я хотел удалить, а затем я установил его в значение «null». До этого у меня был чек, если объект был нулевым (не может удалитьChild то, что является нулевым).

Не могу гарантировать, что это так, как вы «должны» это сделать, так как я очень новичок на сцену Actionscript. Надеюсь, он решает вашу проблему.

0

Вы можете удалить их, передав объект в подробности.gallery.removeChild (объект) или указатель, используя details.gallery.removeChildAt (index). Если вы используете removeChild(), убедитесь, что вы проверили нулевое значение, или оно вызовет ошибку.

Обязательно проверьте файлы справки флэш-памяти, они, безусловно, лучший ресурс, который вы можете использовать.

0

Это приведет к удалению всех детей в мувиклип под названием gallery:

while(gallery.numChildren > 0) { gallery.removeChildAt(0); };