Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Как добавить прелоадер к превьюшкам в галерее (http://www.flasher.ru/forum/showthread.php?t=131419)

casper_61 20.10.2009 12:26

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

В таком варианте отслеживается только загрузка последней
Код AS1/AS2:

galleryXML.onLoad = function(success) {
        if (success) {
                total = this.firstChild.childNodes[1].childNodes.length;
                for (var i:Number = 0; i<total; i++) {
thumbnails.push(this.firstChild.childNodes[1].childNodes[i].attributes.thumbnail);
 
                        var preview_mc:MovieClip = thumbnails_mc.attachMovie("box", "box"+i, i);
                        preview_mc.ID = i;
 
                        var loader:MovieClipLoader = new MovieClipLoader();
                        var listener:Object = {};
 
                        loader.addListener(listener);
                        loader.loadClip(galleryFolder+thumbnails[i], preview_mc.target_mc);
 
                        listener.onLoadProgress = function(target:MovieClipbytesLoaded:Number, bytesTotal:Number):Void {
                        percent = Math.round(bytesLoaded/bytesTotal*100);
                        preview_mc.preloader_txt.text = (percent);
                        };
 
                        }
}


amexdesign 22.10.2009 02:23

попробуй так:
Код AS1/AS2:

var total:Number;
var thumbnails:Array = new Array();
galleryXML.onLoad = function(success) {
        if (success) {
                total = this.firstChild.childNodes[1].childNodes.length;
                for (var i:Number = 0; i < total; i++) {
                        thumbnails[i] = this.firstChild.childNodes[1].childNodes[i].attributes.thumbnail;
                }
                loadThumbs();
        }
}
 
function loadThumbs(){
        for (var i:Number = 0; i < total; i++) {
                var preview_mc:MovieClip = thumbnails_mc.attachMovie("box", "box"+i, i);
                preview_mc.ID = i;
                var mclListener:Object = new Object();
                    mclListener.onLoadStart = function (target:MovieClip){
                    };
                    mclListener.onLoadProgress = function (target:MovieClip, bytesLoaded:Number,bytesTotal:Number):Void {
                        percent = Math.round(bytesLoaded/bytesTotal*100);
                        preview_mc.preloader_txt.text = percent;
                };
                    mclListener.onLoadComplete = function (target:MovieClip){
                };
                    mclListener.onLoadInit = function (target:MovieClip){
                };
                    var image_mcl:MovieClipLoader = new MovieClipLoader();
                    image_mcl.addListener(mclListener);
                    image_mcl.loadClip(thumbnails[i], preview_mc.target_mc);
        }
}


mooncar 22.10.2009 02:33

Лучше ограничится только одним объектом MovieClipLoader и соответственно одним набором обработчиков и одним слушателем. Объявить их вне цикла.
А вот в цикле как раз - только attachMovie и loadClip.
Так можно поступить, поскольку внутри обработчиков есть аргумент target:MovieClip. От него и нужно будет отталкиваться, например, при индикации загрузки.

Вот так:
Код AS1/AS2:

function loadThumbs(){
 
        var mclListener:Object = new Object();
        mclListener.onLoadStart = function (target:MovieClip){
        };
        mclListener.onLoadProgress = function (target:MovieClip, bytesLoaded:Number, bytesTotal:Number):Void {
                percent = Math.round(bytesLoaded / bytesTotal * 100);
                target._parent.preloader_txt.text = percent; //target._parent  - это соответственные box1..., то есть родители target_mc по этой записи: preview_mc.target_mc
        };
        mclListener.onLoadComplete = function (target:MovieClip){
        };
 
        mclListener.onLoadInit = function (target:MovieClip){
        };
        var loader:MovieClipLoader = new MovieClipLoader();
        loader.addListener(mclListener);
 
        for (var i:Number = 0; i < total; i++) {
                var preview_mc:MovieClip = thumbnails_mc.attachMovie('box', 'box' + i, i);
                preview_mc.ID = i;
                loader.loadClip(thumbnails[i], preview_mc.target_mc);                 
        }
}


amexdesign 22.10.2009 03:07

Цитата:

у вас preview_mc.target_mc - это целевой мувик, чему он, интересно, равен?
это не у меня, а у "хозяина" этой темы(см. начало темы). По видимому у него в атаченных мувиках 'box' лежит ещё и мувик непосредственно для превьюшек....

Цитата:

Лучше ограничится только одним объектом MovieClipLoader
согласен, его вообще можно вынести за функцию loadThumbs()....

mooncar 22.10.2009 03:18

Цитата:

Сообщение от amexdesign (Сообщение 859710)
согласен, его вообще можно вынести за функцию loadThumbs()....

Ага, я так обычно делаю...
Код AS1/AS2:

var loader:MovieClipLoader = new MovieClipLoader();
var mclListener:Object = new Object();
loader.addListener(mclListener);
 
mclListener.onLoadStart = function (target:MovieClip){
};
mclListener.onLoadProgress = function (target:MovieClip, bytesLoaded:Number, bytesTotal:Number):Void {
        percent = Math.round(bytesLoaded / bytesTotal * 100);
        target._parent.preloader_txt.text = percent; //target._parent  - это соответственные box1..., то есть родители target_mc по этой записи: preview_mc.target_mc
};
mclListener.onLoadComplete = function (target:MovieClip){
};
 
mclListener.onLoadInit = function (target:MovieClip){
};
 
function loadThumbs(){
        for (var i:Number = 0; i < total; i++) {
                var preview_mc:MovieClip = thumbnails_mc.attachMovie('box', 'box' + i, i);
                preview_mc.ID = i;
                loader.loadClip(thumbnails[i], preview_mc.target_mc);                 
        }
}


flamee 22.10.2009 06:46

Вопрос может даже тупой но?
а) будет ли ждать цикл пока лоадер загрузить картинку?
б) если ждет не зависнет ли флешка пока цикл будет стоять?

mooncar 22.10.2009 15:52

a) а ему и не нужно ждать - если вы сделали, как я рекомендовал, то в цикле у вас только старт загрузки, а за ее обслуживание отвечает экземмпляр MovieClipLoader и обработчики его событий.
б) с чего бы это циклу "стоять"? Цикл отработается своим чередом и практически мгновенно, а все остальное отработася своим чередом.
Автор, Action Script работает асинхронно.


Часовой пояс GMT +4, время: 11:24.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.