PDA

Просмотр полной версии : Можно ли узнать вес изображения не начиная его загрузки?


джонатан
12.02.2009, 03:41
Здравствуйте! Хочу сделать следующую штуку.
Вобщем флешка читает xml, в котором указаны пути к jpg изображениям. Далее грузит их перерисовывает в битмап дату невыводя на экран, и после того как все загрузит, начинаются там всякие штуки происходить :) И вот я хочу сделать такой прелоадер, который будет показывать что идет загрузка, пока грузятся все изображения. Т.е. одна полоса, а не на каждую картинку по полоске. Как бы мне это осуществить?
Спасибо.

silin
12.02.2009, 10:55
как вариант такая схема: запускаем сразу все загрузки в onLoadProgress складываем информацию, приходящую от каждой, суммируем..
var _loader:MovieClipLoader = new MovieClipLoader();
_loader.addListener(this);

var _map:Object = {};//объект для хранения информации
//запускаем загрузку всех
for (var i:Number = 0; i<10; i++) {
var mc:MovieClip = _root.createEmptyMovieClip("clip"+i, i);
_map[mc] = {id:i, loaded:0, total:0, loadComplete:false, mc:mc};
_loader.loadClip("face"+i+".jpg",mc);
}
//окнчание всех загрузок
function onAllComplete() {
trace("все");
for (var key in _map) {
_map[key].mc._visible = true;
}
}

//окончание загрузки каждого
function onLoadInit(target_mc:MovieClip) {
//ставим флаг в общем списке
_map[target_mc].loadComplete = true;

//что-то делаем с загруженным (срисовываем в битмапДату, ставим на место, и т.п.)
target_mc._x = 100*_map[target_mc].id;
target_mc._visible = false;

//смотрим готовность всех
for (var key in _map) {
if (!_map[key].loadComplete) {
return;
}
}
onAllComplete();
}

//чиатем информацию по конкретной загрузке, суммируем для всех
function onLoadProgress(target_mc:MovieClip, loadedBytes:Number, totalBytes:Number) {
_map[target_mc].loaded = loadedBytes;
_map[target_mc].total = totalBytes;

var sumLoaded:Number = 0;
var sumToatl:Number = 0;
for (var key in _map) {
sumLoaded += _map[key].loaded;
sumToatl += _map[key].total;
}
trace("progress: "+sumLoaded/sumToatl);
}
нюанс в том, что браузер вряд ли запустит их все сразу, а все равно только порциями в очередь, а пока они все не стартуют информация loaded/total будет кривая и такой прелоадер будет нелогично дергаться, но попробовать можно..
имхо надежнее уже во флеше каждую следующую запускать по окончании предыдущей, а юзеру показывать какая по счету загрузка и ее прогресс, если надо

iNils
12.02.2009, 11:19
Запросить серверный скрипт, который вернет размер картинки.

nOobCrafter
12.02.2009, 12:17
Ну а если попроще попробовать, сделать последовательную загрузку изображений и оттуда плясать, огрехи есть, но скрип попроще и разницы незаметно:
// бла бла бла это только отрывок кода, есть клип контейнер и в нем создается по клипу контейнеру для каждой фотки, в эти мелкие клипы и грузится все.
var loaderListener:Object = new Object();
loaderListener.onLoadStart = function(holderClip:MovieClip) {}; // тут перечисляются события загрузки
// все их описывать небуду, просто приведу что начинается со старта, и использую что нам надо, остальное можно взять в хелпе
loaderListener.onLoadProgress = function(holderClip:MovieClip, loadedBytes:Number, totalBytes:Number):Void // в момент загрузки картинок...
{
var percent:Number = Math.round((i + loadedBytes / totalBytes) * 100 / total); // вычисляем количество загруженых байт превьюхи

load_tf.text = "Загрузка изображений";//"Загружено " + percent + "%"; // если хотим что бы отображалось попроцентно то вместо надписи пишем то что в коментарии
load_tf.autoSize = true; // применяем расширение к тексту
load_tf.setTextFormat(my_fmt); // применяем текстформат
load_tf._x = (stage_width - load_tf._width) / 2; // расоплогаем по оси х (центрируем)

progressBar_mc._visible = true; // выводим прогрессбар
progressBar_mc._x = (stage_width - 100) / 2; // центрируем его
progressBar_mc._y = load_tf._y + load_tf._height + progressBar_mc._height;
progressBar_mc.bar_mc._xscale = percent; // чем больше процент загрузки тем больше полоска
};

loaderListener.onLoadInit = function(mc:MovieClip) // когда загрузка завершена
{
i++ // вот тут, уже i = 1 и дальше его увеличиваем
imageLoader.loadClip(img[i], hmc['loader_' + i].pic); // берем нужную превью из массива и загружаем в нужный мувик

if ( i == total) // когда загружены ВСЕ картинки
{
progressBar_mc.removeMovieClip(); // удаляем что не нужно
load_tf.removeTextField();
// тут же уже можно писать что будет после того как фотки загрузятся, допустим переход на второй кадр или что то такое.
}
mc.img_width = mc._width; // получаем размеры фоток;)
mc.img_height = mc._height; // получаем размеры фоток;) // так же тут уже можно центрировать нашу картинку, или выровнять по другому
};

////// Загружем картинки в мувик контейнер
var imageLoader:MovieClipLoader = new MovieClipLoader();
imageLoader.addListener(loaderListener);

imageLoader.loadClip(img[0], hmc['loader_' + 0].pic); // берем первую картинку из массива и загружаем в нужный мувик
i = 0; // тут ставим число картинок в 0, потому что при загрузке мы будем их считать опять.
если надо могу выложить все.. Охгрехи в принципе есть, но это неособо заметно и бытовому юзеру ничего не даст.
З.Ы. получается именно так как сказал silin))

джонатан
12.02.2009, 15:20
Спасибо всем. Так то оно так, но не подходит такой вариант. Т.к. не поп порядку будут картинки отображены, да и на маленькой скорости подключения, прелоадер будет скокать как бальной :).
Еще раз всем спасибо.

silin
12.02.2009, 15:28
порядок: никто не мешает порядок сохранить (в моем примере сохраняется)
скакать: забить общий вес руками (или спросить у пхп) и скакать не будет