Организация результатов XML в виде ячеек в контейнере (AS3) - PullRequest
0 голосов
/ 19 апреля 2010

У меня возникли проблемы с выяснением того, как организовать данные, извлеченные из XML, в ячейки внутри контейнера. Я уверен, что это должно быть основной вещью в AS3, но моя голова зажарена .. кто-нибудь может помочь?

В основном массив, если он передан callThumbs(), который перебирает его и сравнивает записи с предварительно загруженным XML _my_images. Если совпадение найдено, оно отправляется на processXML, который загружает всю необходимую информацию и загружает миниатюру .jpg. Все это затем подается на createCell, который создает определенную ячейку со значениями положения в зависимости от значений x_counter и y_counter (4 ячейки в строке) и добавляет ячейку в контейнер _container_mc.

Проблема: все это прекрасно работает и выглядит нормально, проблема в том, что ячейки в контейнере не отображаются в порядке убывания . Они расположены в случайном порядке, возможно потому, что для загрузки некоторых из .jpg требуется больше времени и т. Д. Как мне легко организовать ячейки внутри контейнера в порядке убывания по значению XML .id? Или как заставить Flash ждать, пока миниатюра и данные не будут загружены, а ячейка создана и добавлена?

Спасибо, ребята, буду очень признателен за всю помощь!

PJ

//Flash (AS3)       

       function callThumbs(_my_results:Array):void {   // selector = 1 for specific items, 2 for search items

            var _thumb_url:XML;

            for (var r:Number=0; r < _my_results.length; r++) { // iterate through results vector, compare with _my_images XML .id

                for (var i:Number=0; i < _my_images.length(); i++) {

                    if (_my_images[i].@id.toXMLString() == _my_results[r]) {

                        _thumb_url=_my_images[i];

                        processXML(_thumb_url, i);

                    }

                }
            }

        } // End callThumbs


        function processXML(imageXML:XML, num:Number) { // Processes XML data and loads .jpg thumbnail

            var _thumb_loader=new Loader();

            _thumb_loader.load(new URLRequest("thumbs/thumb_sm/" + imageXML.@id + "_st.jpg"));
            _thumb_loader.contentLoaderInfo.addEventListener(Event.COMPLETE,thumbLoaded);
            _thumb_loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, urlNotFound);

            var id:XMLList = new XMLList;
            id = imageXML.@id;
            var description:XMLList = new XMLList;
            description = imageXML.@description;

            function urlNotFound(event:IOErrorEvent):void {
                trace("The image URL '" + String(imageXML.@id) + "' was not found.");
            }

            function thumbLoaded(e:Event):void {
                    var imageLoader:Loader = Loader(e.target.loader);
                    var bm:Bitmap = Bitmap(imageLoader.content);

                    createCell(bm, id, description, num);
                    adjustFooterBar(); // Adjust bottom footer
            }


        } // End processXML



        private function createCell(_image:Bitmap, _id, _description:String, _position):void { // Creates a cell with data, add to container

            var _cell_mc = new CellTitle();         

            _cell_mc.initCell(_image, _id, _description, _position, x_counter, y_counter);

            if (x_counter+1 < 4) {
                x_counter++;
            } else {
                x_counter = 0;
                y_counter++;
            }

            _container_mc.addChild(_cell_mc); // movieclip container

        } // End createCell

1 Ответ

1 голос
/ 19 апреля 2010

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

(AS3)
   // create these outside of the functions so they can be updated/used by both
   var i:Number = 0;
   var totalResults:Number = _my_results.length;

   // start loading the first thumbnail
   callThumbs(0);

   function callThumbs(resIndex:Number):void { 

        var _thumb_url:XML;
        var result = _my_results[resIndex];

        for (var n:Number = 0; n < _my_images.length(); i++) {

            if (_my_images[n].@id.toXMLString() == result) {

                _thumb_url = _my_images[n];

                processXML(_thumb_url, n);

                /**
                 * break here because we don't want to do another iteration
                 * the complete handler for the thumbnail loader will determine if this function
                 * is to be called again.
                 */
                break;
            }

        }

    } // End callThumbs


    function processXML(imageXML:XML, num:Number) {

        var _thumb_loader = new Loader();

        _thumb_loader.load(new URLRequest("thumbs/thumb_sm/" + imageXML.@id + "_st.jpg"));
        _thumb_loader.contentLoaderInfo.addEventListener(Event.COMPLETE,thumbLoaded);
        _thumb_loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, urlNotFound);

        var id:XMLList = new XMLList;
        id = imageXML.@id;
        var description:XMLList = new XMLList;
        description = imageXML.@description;

        function urlNotFound(event:IOErrorEvent):void {
            trace("The image URL '" + String(imageXML.@id) + "' was not found.");
        }

        function thumbLoaded(e:Event):void {
                var imageLoader:Loader = Loader(e.target.loader);
                var bm:Bitmap = Bitmap(imageLoader.content);

                createCell(bm, id, description, num);
                adjustFooterBar(); // Adjust bottom footer

            // determine if there is another thumbnail to be loaded
            if (i < totalResults) {
                i++;
                callThumbs(i);
            }

        }


    } // End processXML



    private function createCell(_image:Bitmap, _id, _description:String, _position):void { // Creates a cell with data, add to container

        var _cell_mc = new CellTitle();         

        _cell_mc.initCell(_image, _id, _description, _position, x_counter, y_counter);

        if (x_counter+1 < 4) {
            x_counter++;
        } else {
            x_counter = 0;
            y_counter++;
        }

        _container_mc.addChild(_cell_mc); // movieclip container

    } // End createCell

Кроме того, просто из любопытства, это делается на временной шкале?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...