AS3 Как удалить предыдущие загрузчики - PullRequest
1 голос
/ 27 февраля 2009

Во Flash CS4 я создаю фотогалерею. Моя цель - загрузить разные миниатюры из нескольких изображений. Мне удалось, чтобы при нажатии на изображение отображалось несколько миниатюр, но при нажатии на другое изображение новые эскизы помещаются поверх старых. Может кто-нибудь помочь мне с тем, как избавиться от старых миниатюр?

Вот код:

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++;
  }
}

Ответы [ 5 ]

2 голосов
/ 28 февраля 2009

Здесь Array - твой друг. Вы можете сделать это без массива, просто используя цикл 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].@path);
                }
                _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 голосов
/ 13 января 2013

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

while( gallery.numChildren > 0) { gallery.removeChildAt(0); };
0 голосов
/ 28 февраля 2009

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

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

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

0 голосов
/ 28 февраля 2009

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

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

0 голосов
/ 28 февраля 2009

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

...