Просмотр полной версии : Как добавить прелоадер к превьюшкам в галерее
casper_61
20.10.2009, 12:26
Есть галерея, как добавить прелодер для каждой превьюшки? Как правильно создать листенер для каждой превьюхи?
В таком варианте отслеживается только загрузка последней
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:MovieClip, bytesLoaded:Number, bytesTotal:Number):Void {
percent = Math.round(bytesLoaded/bytesTotal*100);
preview_mc.preloader_txt.text = (percent);
};
}
}
amexdesign
22.10.2009, 02:23
попробуй так:
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);
}
}
Лучше ограничится только одним объектом MovieClipLoader и соответственно одним набором обработчиков и одним слушателем. Объявить их вне цикла.
А вот в цикле как раз - только attachMovie и loadClip.
Так можно поступить, поскольку внутри обработчиков есть аргумент target:MovieClip. От него и нужно будет отталкиваться, например, при индикации загрузки.
Вот так:
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()....
согласен, его вообще можно вынести за функцию loadThumbs()....
Ага, я так обычно делаю...
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);
}
}
Вопрос может даже тупой но?
а) будет ли ждать цикл пока лоадер загрузить картинку?
б) если ждет не зависнет ли флешка пока цикл будет стоять?
a) а ему и не нужно ждать - если вы сделали, как я рекомендовал, то в цикле у вас только старт загрузки, а за ее обслуживание отвечает экземмпляр MovieClipLoader и обработчики его событий.
б) с чего бы это циклу "стоять"? Цикл отработается своим чередом и практически мгновенно, а все остальное отработася своим чередом.
Автор, Action Script работает асинхронно.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.