Форум 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=114482)

джонатан 30.07.2008 15:12

Загрузка изображений. Грузит только последнее.
 
Добрый день! Я делаю фотогалерею, которая потгружает в себя внешние изображения. Потгрузив, BitmapData перерисовывает их и Matrix уменьшает, тем самым создавая превью. Но вот почему-то, у меня загружается только последнее изображение!

Код:

import flash.display.BitmapData;
import flash.geom.Matrix;
import mx.transitions.Tween;

var mcl = new MovieClipLoader();
var mclLst = new Object();
var mtrx = new Matrix();
var bmd = new BitmapData(100, 75, true, 0x00000000);

mtrx.scale(0.15625, 0.15625);

mclLst.onLoadInit = function() {
        bmd.draw(photo_mc[imgContPath], mtrx);
        preview_mc[prevContPath].attachBitmap(bmd, this.getNextHighestDepth(), "auto", true);
        trace(prevContPath + " загружен");
}
// Слушатель MovieClipLoader'a
mcl.addListener(mclLst);
//Грузим картинку:
// all это переменная потгружаемая из внешнего TXT в котором задается колл-во изображений, которые надо потгрузить:

for (var q = 0; q < all; q++) {
        var imgPath = "img/img" + q + ".jpg";
        var imgContPath = "photo_cont" + q;
        var backImgContPath = "photo_cont" + (q-1);
        var prevContPath = "preview_cont" + q;
        var backPrevContPath = "preview_cont" + (q-1);
        //Создаю контейнеры для фотографий и превью:
        photo_mc.createEmptyMovieClip(imgContPath, this.getNextHighestDepth());
        preview_mc.createEmptyMovieClip(prevContPath, this.getNextHighestDepth());
        if( q <= 0) {
                photo_mc[imgContPath]._x = 0;
        } else {
                photo_mc[imgContPath]._x = preview_mc[backImgContPath]._x + 108;
        }
        mcl.loadClip(imgPath, photo_mc[imgContPath]);
}

Ткните пожалуйста где я ошибся. Спасибо за внимание.

Molecula 30.07.2008 15:34

1) for()...loop - убрать.
2) Загнать название фоток в массив.
3) В теле функции Инита шагаем по массиву и грузим одну фотку, проверяя не в конце ли массива мы находимся - что бы опять не вызвать loadClip(...).

Т.е. в начале мы loadClip(...), что бы сработал Init.
Сжатый пример:
Код:

...
var counter:Number = 0;// наш счетчик, который показывает, сколько раз мы загрузили фоток из массива.
var arr:Array = [];
...
onLoadInit = function() {
this.counter++;
if(this.counter<this.arr.length){
loadClip(myMc, this.arr[this.counter]);
}
else trace('We finished');
}

loadClip(myMc, this.arr[this.counter]);


Wolsh 30.07.2008 15:37

И чему по-Вашему равен [imgContPath], когда цикл уже отработал (это же доли секунды), а загрузка только началась? Последнему, конечно. Он и отрисовывается в битмапдату.

Alex_beginner 30.07.2008 15:44

Джонатан!

Начнем. Давайте рассмотрим вот эту строчку:

Код:

bmd.draw(photo_mc[imgContPath], mtrx);
Какие мысли она навивает?! Почему, Вы решили, что первым обязательно загрузится картинка, которую первой Вы поставили в loadClip. Первой, скорее всего, загрузится наименьшая по размеру картинка. Поэтому, предлагаю
издеваться над мувами, которые уже на самом деле подгружены, т.е.:

Код:

mclList.onLoadInit = function(target_mc:MovieClip) {}
И вот тогда, target_mc будет реально загруженный клипик. Ну, я так думаю. Мож в этом дело.

джонатан 30.07.2008 16:06

Ну и запутали вы меня, товарищи! Итак:
Molecula, загнать названия фоток в массив я немогу, т.к. я делаю универсальную фотогалерею. Фотки будут часто меняться, и их колличество тоже будет всегда разным. Поэтому я и сделал что-бы пременная all грузилась из блокнота. В нем владелец будет задавать число равное колличеству фоток которые нужно будет загрузить.

Wolsh, да, действительно, это именно так.

Alex_beginner, неа. Не в этом.


А если я for заменю onEnterFrame и вставлю флаг, чтобы загрузка юыла строго последовательной, будет работать?

Molecula 30.07.2008 16:42

Честно говоря как-то не разумно, что клиент будет сливать ТХТ файл, менять там цифру, потом заливать.
А исходя из этой срочки:
Код:

var imgPath = "img/img" + q + ".jpg";
Ещё и переименовывать их численно.

Лечге было показать, как в ХМЛь забивать названия файлов да и всё - ну это уже дело хозяйское.

onEnterFrame - вообще загубит дело.

Ну, раз у Вас есть общее кол-во фоток то:
Код:

...
var counter:Number = 0;// наш счетчик, который показывает, сколько раз мы загрузили фоток из массива.
var globalAmountOfPhotos:Number = 144; // например
...
onLoadInit = function() {
this.counter++;
if(this.counter < globalAmountOfPhotos){
loadClip(myMc, this.counter);
}
else trace('We finished');
}

loadClip(myMc, 'your_path'+this.counter+'extension');


джонатан 30.07.2008 17:07

А какая разница? Перезаливать TXT или XML

Так а bmd.draw будет перерисовывать загруженное изображение где?

И что такое 'extension' ???

iNils 30.07.2008 17:33

Цитата:

Сообщение от джонатан (Сообщение 755357)
А какая разница? Перезаливать TXT или XML

Ну, захочет человек вставить между картинками 3 и 4 другую (всего их скажем 100) и придется ему переименовывать с 4-ой по 100-ю на единицу.

Alex_beginner 30.07.2008 17:55

Вложений: 1
Цитата:

Alex_beginner, неа. Не в этом.
Да ну!!

Цитата:

Код:

bmd.draw(photo_mc[imgContPath], mtrx);

imgContPath у Вас определяется в циклике:

Цитата:

Код:

for (var q = 0; q < all; q++) {
        var imgPath = "img/img" + q + ".jpg";
        var imgContPath = "photo_cont" + q;
        var backImgContPath = "photo_cont" + (q-1);
        var prevContPath = "preview_cont" + q;
        var backPrevContPath = "preview_cont" + (q-1);
        //Создаю контейнеры для фотографий и превью:
        photo_mc.createEmptyMovieClip(imgContPath, this.getNextHighestDepth());
        preview_mc.createEmptyMovieClip(prevContPath, this.getNextHighestDepth());
        if( q <= 0) {
                photo_mc[imgContPath]._x = 0;
        } else {
                photo_mc[imgContPath]._x = preview_mc[backImgContPath]._x + 108;
        }
        mcl.loadClip(imgPath, photo_mc[imgContPath]);
}


Циклик проходит, и переменная imgContPath принмает последнее значение, а картиночки то еще грузятся. И вот это перестает работать:


Цитата:

Код:

mclLst.onLoadInit = function() {
        bmd.draw(photo_mc[imgContPath], mtrx);
        preview_mc[prevContPath].attachBitmap(bmd, this.getNextHighestDepth(), "auto", true);
        trace(prevContPath + " загружен");
}


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

Правда проблему с prevContPath это не снимает.

Теперь, вероятно привьюшки у Вас все одинаковые, т.е тоже какбы видна последняя картинка? Если так (а это так), создавайте битмапдату каждый раз, когда хотите отрендерить в нее подгруженное в мувиклип изображение.

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

Попробовал исправить некторые ошибки до работоспособности кода, втиснув свои исправления в созданную Вами структуру (см.вложение). Получилось отвратительно.

джонатан 30.07.2008 18:04

Alex_beginner, вы как-то раз нетак давно выкладывали исходник, на похожую тему. Назывался файл "Последовательная загрузка изображений (created_by_Alex_beginner)" Так вот я сейчас решил по нему сделать свою задачу. Все получилось, но с загрузкой каждой новой фотки, битмапа тоже перерисовывается в неё, как вы и описали выше. Сейчас гляну что Вы прикрепили на этот раз...

джонатан 30.07.2008 18:10

Только почему-то битмап не дорисовывает последнюю картинку...

Код:

import flash.display.BitmapData;

var my_mcl:MovieClipLoader = new MovieClipLoader();
var myListener:Object = new Object();

var count=0;
var flag:Boolean = true;//флаг, сигнализирующий возможность следующей загрузки
var i:Number = 1;//счетчик файлов, клипов
var N:Number = 30;//количество картинок
myListener.onLoadInit = function(target_mc:MovieClip) {
        count++;
        flag = true;
};
my_mcl.addListener(myListener);
this.onEnterFrame = function():Void {
        if (flag) { 
        var zzz = "mc"+i;
        var xxx = "mc" + (i-1);
        var qqq = "dmc" +i;
        var www = "dmc" + (i-1);
        flag = false;
        var bmd:BitmapData = new BitmapData(80, 80, true, 0x00000000);
        bmd.draw(this[xxx]);
        this[www].attachBitmap(bmd, this.getNextHighestDepth(), "auto", true);
        this.createEmptyMovieClip(zzz, this.getNextHighestDepth());
        this.createEmptyMovieClip(qqq, this.getNextHighestDepth());       
        if(i == 1) {
                this[zzz]._x = 5;
                this[zzz]._y = 5;
                this[qqq]._x = 5;
                this[qqq]._y = 430;
        } else if( i <= 6) {
                this[zzz]._x = this[xxx]._x + 85;
                this[zzz]._y = this[xxx]._y;
                this[qqq]._x = this[www]._x + 85;
                this[qqq]._y = this[www]._y;
        } else if( i == 7){
                this[zzz]._x = 5;
                this[zzz]._y = this[xxx]._y + 85;
                this[qqq]._x = 5;
                this[qqq]._y = this[www]._y + 85;
        } else if (i <= 12) {
                this[zzz]._x = this[xxx]._x +85;
                this[zzz]._y = this[xxx]._y;
                this[qqq]._x = this[www]._x +85;
                this[qqq]._y = this[www]._y;
        } else if (i == 13) {
                this[zzz]._x = 5;
                this[zzz]._y = this[xxx]._y + 85;
                this[qqq]._x = 5;
                this[qqq]._y = this[www]._y + 85;
        } else if (i<= 18) {
                this[zzz]._x = this[xxx]._x + 85;
                this[zzz]._y = this[xxx]._y;
                this[qqq]._x = this[www]._x +85;
                this[qqq]._y = this[www]._y;
        } else if (i == 19) {
                this[zzz]._x = 5;
                this[zzz]._y = this[xxx]._y + 85;
                this[qqq]._x = 5;
                this[qqq]._y = this[www]._y +85;
        } else if (i <= 24) {
                this[zzz]._x = this[xxx]._x + 85;
                this[zzz]._y = this[xxx]._y;
                this[qqq]._x = this[www]._x + 85;
                this[qqq]._y = this[www]._y;
        } else if (i == 25) {
                this[zzz]._x = 5;
                this[zzz]._y = this[xxx]._y + 85;
                this[qqq]._x = 5;
                this[qqq]._y = this[www]._y + 85;
        } else {
                this[zzz]._x = this[xxx]._x + 85;
                this[zzz]._y = this[xxx]._y;
                this[qqq]._x = this[www]._x + 85;
                this[qqq]._y = this[www]._y;
        }
        my_mcl.loadClip("images/"+i+".jpg", zzz);
        i++;
        if (i>N) {
            delete this.onEnterFrame; break;
        }
}


Wolsh 30.07.2008 18:12

Отвлечемся на секунду от того, как программа получает список файлов. Это можно изменить и потом, все обдумав и обсудив с заказчиком.
Послушайте, джонатан, все операции с загруженными картинками можно проводить только после загрузки. Обратите внимание, что метод onLoadInit имеет ссылку на загруженное изображение (клип, который теперь это изображение). Т.е. в коде
Код:

mclLst.onLoadInit = function(_mc) {
    trace(_mc)
}

в теле обработчика у Вас есть ссылка _mc. Воспользуйтесь!
pS Уважаю мнение коллег, но последовательная загрузка вовсе не является обязательным условием. Один лоадер прекрасно грузит сотню картинок одновременно, и для каждой произойдет событие и будет получена ссылка на клип. А уж дальше все в наших руках))))

Alex_beginner 30.07.2008 18:15

Вложений: 1
Джонатан! Вот второй вариант последовательной загрузки изображений без onEnterFrame (на мой взгляд эффективнее) - см.вложение, если понадобиться.
Последовательная загрузка может понадобиться в случае когда Вам необходимо во чтобы то ни стало загрузить какое-либо изображение первым, вторым,..., независимо от его размера (в байтах). Т.е. порядок срабатывания onLoadInit будет зависить непосредственно от порядка загрузки, установоленного разрабочиком, а не от размера загружаемых изображений.

джонатан 31.07.2008 13:04

Alex_beginner, спасибо за предыдущий исходник! Все заработало! За этот тоже спасибо, полюбому пригодится.
Единственный недостаток, в том, что картины грузятся и размещаются в еврейском порядке (справа на лево), но уж это я думаю сам решу.
Wolsh, да! Спасибо, я уже понял. Просто раньше не знал что это такое. Теперь буду знать.
Всем спасибо, огромнейшее! Незнаю, что бы я делал без вашей доброты, понимания, и отзывчивости!

//UPDATE

Факинг шит! Не сказать, что хорошо, что MCL грузит фотки в разнобой, мне же надо чтобы когда жмякнешь на превью (bmd) показывалась фотка, соответствующая картинке на превью. А у меня получаеьтся когда я перевожу в битмап, фотки распологаются в разброс, а нумеруются по порядку...

Никто не подскажет, как с этим быть?

Wolsh 31.07.2008 13:24

Чтож, продолжаем курс)))
Хотя я не понял, почему в разнобой, если загрузка последовательная. Или она не последовательная?)))) Я под последовательной понимаю что пока первая картинка не загрузилась, загрузка второй не начинается. Если так, то откуда разнобой?
Теперь о структурировании хаоса. Если бы Вы порылись для начала в том, что здесь выкладывают товарищи на эту тему, то заметили бы одну характерную деталь. Для загрузки картинки создается некий контейнер - пустой клип. В этом контейнере создается еще один пустой клип, в который собственно и грузится картинка. Зачем?
Затем, что клип, в который будет загружаться картинка, не способен сохранить присвоенные ему свойства - после загрузки они исчезнут. Но его контейнер может. Поэтому в цикле или рекурсии, где Вы запускаете загрузки, Вы сохраняете в свойстве контейнера некий идентификатор, допустим итератор цикла или другой каунтер. И тогда контейнер картинки будет хранить этот ID, и после загрузки Вы можете узнать его через mc._parent.ID. Естественно, таким же образом в свойствах контейнера Вы можете сохранить ссылку на большое изображение и все прочие данные, связанные с этим изображением. Посмотрите, например, тут
http://www.flasher.ru/forum/showthread.php?t=112985

Alex_beginner 31.07.2008 14:54

Джонатан! Давайте поступим так. Вы полностью изложите что бы Вы хотели реализовать, в деталях желательно, а мы, в свою очередь попытаемся это воплотить в жизнь. А уж потом, развернем дискуссию на тему: "Ошибки кода, загрузки изображений (клипов)..., работа с BitmapData". Если Вы согласны дайте нам знать, письменно изобразив, то что Вы хотели бы реализовать. Дело в том, что мы знаем только поверхностные черты Вашего проекта, и поэтому, приходиться использовать наводящие вопросы, реплики и даже исходники, но пока безрезультатно. Давайте будем конструктивнее в нашей с Вами работе.

джонатан 31.07.2008 17:15

Вложений: 1
Alex_beginner, я думаю это лишнее. Я уже добился того, его хотел. И у меня осталсь один очень странный баг. Причем он настолько странный, что просто я в шоке. Короче. Еще раз низкий поклон вам. Я взял ваш вчерашний исходник (Последовательная загрузка изображений (created_by_Alex_beginner,v2).rar) и переделал его под свои нужды. Так вот, все вроде бы как отлично работает, но есть одно но! Я думаю объяснять буде никчему, лучше увидьте её. А как работает флешка я счас объясню:

Создаются клипы:
mc + i
dmc + i
[mc + i]fotoCountainer

Создаются 2 объекта класса BitmapData
1.bmd
2.bmd2

В [mc + i]fotoCountainer загружаются фотки, и срабатывает onLoadInit. Он делает mc + i.alpha = 0. Битмап даты перерисовывают их. bmd перерисовав помещает в dmc+i, а bmd в mc + i. После этого [mc + i]fotoCountainer удаляется.
Получается, что битмапы, лежащие в mc+i сразу не видны, а видны только их копии размещенные в dmc+i. Но если нажать на однин из dmc+i то mc+i становится _alpha 100.

Так вот, если клацать по 8ой - 30ой фотке, то все работает прекрасно, но если по 1-7 то не появляются. Но как только флешку чуть растянешь (сам плеер) то фотка появляеится. Бред какой-то.
Смотрите. (флешку тянуть не получится, можно сменить размер окна броузера, тогда тоже появится)
Креплю исходник.

Может кто знает чт это такое???

Alex_beginner 31.07.2008 17:42

Хех!:D Любопытный сайт у Вас получился.:) Да, странноватый эффект - при ресайзе браузера картинка появляется. А Вы не пробовали картинки менять (другие форматы)?

Просьба, выложите файл в формате Flash8 (у меня нет CS3, sorry).

Wolsh 31.07.2008 18:14

Вот в этом куске
Код:

this[qqq].onRelease = function() {
        for(var j = 0; j <= N; j++) {
        var ttt = "mc" +j;
        var hhh = "dmc" +j;
            this._parent[hhh]._alpha = 100;
            this._parent[ttt]._alpha = 0;
            //var twOut = new Tween(this._parent[ttt], "_alpha", mx.transitions.easing.Regular.easeOut, 100, 0, 0.5, true);
    }
            this._parent[zzz]._alpha = 50;
            this._alpha = 20;
            //var twIn = new Tween(this._parent[zzz], "_alpha", mx.transitions.easing.Regular.easeIn, 0, 100, 1, true);
    }

Чему равен zzz В МОМЕНТ НАЖАТИЯ ? Протрейсите
_________
UPD: А у меня всё появляется, во флэше.

джонатан 31.07.2008 19:59

Wolsh, он равен mc+(номер клипа по которому клацнул.)

Нееее... Тут все ок. Я правда счас уже переделал. Короче, всеравно проблема непонятна, но как избежать её я придумал.
Вобщем. Кто смотрел, получается у меня верхние картинки все расположены в одном и том же месте, а нижние на расстоянии друг от друга. Так вот, (у меня в коде закоменчено) я сделал чтобы и верхние тоже так-же распологались не в одном и том-же месте, и все стало работать. Как я понял, видимо глюк был, с Глубиной клипов, но почему только в первых 8-ми, я непонял.

Но конечно это тоже не выход, т.к. я буду переносить этот код в свою галлерею, и там, мне нужно чтобы основные фотки стояли в одно и том-же месте...

//UPDATE

Все! Сделал! Действительно проблемы была c глубинами. Почему глючит я так и не понял, от глюга избавился. Я сделал, чтобы после того как клип становится _alpha = 0, еще вдобавок прописал _visible = false; Ну а потом когда по нему жмешь, _visible = true, и альфа 100 через Tween. Все заработало!

Спасибо всем кто старался мне помочь, очень приятно, что уже никто не посылает меня в хелп а реально старается помочь. Особенное спасибо Alex_beginner`у за мега активное участие в решении моей проблемы, и Wolsh`за четкие объяснения многих вещей.

Wolsh 31.07.2008 20:30

Рад что всё получилось. Однако жаль выбросить потраченный час, поэтому я всеже представлю свой вариант.
Код:

Stage.scaleMode = "noScale";
Stage.align = "TL";
import flash.display.BitmapData;
////
var cols:Number = 6;
var pics:Number = 30;
var vspace:Number = 10;
var hspace:Number = 10;
var img_height:Number = 70;
var img_width:Number = 70;
////
var bitmap:BitmapData = new BitmapData(img_width, img_height, false, 0);
var gallery:MovieClip = _root.createEmptyMovieClip("gallery", 10);
var float_pic:MovieClip = _root.createEmptyMovieClip("float_pic", 20);
var float_bmp:BitmapData = bitmap.clone();
float_pic.attachBitmap(float_bmp, 0, "auto", true);
float_pic._alpha = 50;
gallery._y = 200;
////
var current:MovieClip;
var listener:Object = new Object();
var loader:MovieClipLoader = new MovieClipLoader();
loader.addListener(listener);
////
listener.onLoadInit = function(mc){
    var bmp:BitmapData = bitmap.clone();
    var container:MovieClip = mc._parent;
    container.attachBitmap(bmp, 10, "auto", true);
    bmp.draw(mc);
    mc.removeMovieClip();
    var id:Number = container.id;
    var horder:Number = (id+cols)%cols;
    horder = horder==0 ? cols-1 : horder-1
    var vorder:Number = Math.ceil(id/cols)-1;
    container._x = horder*img_width + hspace*horder;
    container._y = vorder*img_height + vspace*vorder;
    container.onRelease = function  () {
        float_bmp.draw(container);
        current._alpha = 100;
        container._alpha = 20;
        current = container;
        trace("Загружаем большую картинку с адреса "+container.big_url);
    }

    if (container.id < pics) {
        loadPic(container.id+1);
    } else {
        loader.removeListener(listener);
        delete listener;
        delete loader;
        delete bitmap;
    }
    trace("изображение "+container.id+"\nряд "+(vorder+1)+"\nстолбец "+(horder+1)+"\n")
}
////
function loadPic (counter:Number) {
    var img_url:String = "images/"+counter+".jpg";
    var big_url:String = "images/big/"+counter+".jpg";
    var container:MovieClip = gallery.createEmptyMovieClip("p"+counter, counter);
    var mc:MovieClip = container.createEmptyMovieClip("_mc",0);
    container.id = counter;
    container.big_url = big_url;
    loader.loadClip(img_url, mc);
}
////
loadPic(1);


Alex_beginner 03.08.2008 11:36

Вложений: 1
Джонатан! Прошу меня извинить за задержку в предоставлении обещанного мной приложения (не смог выйдти на связь по личным причинам). Если тема еще актуальна, хочу аддитивно к вариантам коллег представить свой вариант реализации Вашего проекта.



Код:

//////////////////////////////////////////////////////////////////////////////////////////////////
//  Приложение, формирующее галлерею с превью-картинками и полномасшатабный просмотр                       
//        загруженных фотографий.                                                                                                                                       
//                                                                                                                                                                                               
//  Основные преимущества:                                                                                                                                                                       
//  1. Независимые друг от друга загрузки изображений (параллельная загрузка), в связи с чем,       
//      загрузка осуществляется быстро;                                                                                                                       
//  2. При параллельной загрузке изображений вывод их превью-аналогов в превью-область                       
//      производится последовательно слева-направо и сверху вниз, а не хаотично,                               
//                в зависимости от размера изображения;                                                                                                       
//        3. Вы имеете возможность работать с уже загруженными изображениями пока другие грузятся;       
//  4. Размер превью-изображений и полномасштабных изображений не зависит от геометрических       
//      размеров загружаемых изображений, т.е. изображения любых размеров "втиснутся" в области       
//      просмотра;                                                                                                                                                               
//  5. Легкость настройки и управления;                                                                                                               
//  6. Относительная простота и структурированность кода. Это улучшает его читабельность и               
//      облегчает работу с кодом по его оптимизации и рефакторингу.                                                       
//                                                                                                                                                                                               
//                                                                                                                                                                                               
//                                                                        Created by Alex_beginner.                                                                       
//                                                                  All rights not reserved, 2008.                                                                       
//                                                                                                                                                                                               
//////////////////////////////////////////////////////////////////////////////////////////////////

import flash.display.BitmapData;
import flash.geom.Matrix;

//************************************************************************************************
//        НАСТРОЙКИ
//************************************************************************************************
var N:Number = 30;//количество загружаемых изображений
var imgCounter:Number = 1;//счетчик загруженных изображений
var photoWidth:Number = 250;//ширина полномасштабной области просмотра
var photoHeight:Number = 240;//высота полномасштабной области просмотра
var photoX:Number = 350;//координата X левого-верхнего угла полномасштабной области просмотра
var photoY:Number = 200;//координата Y левого-верхнего угла полномасштабной области просмотра
var prevWidth:Number = 40;//ширина превью-области
var prevHeight:Number = 40;//высота превью-области
var prevVCount:Number = 5;//количество изображений в превью-области по вертикали
var prevHCount:Number = 6;//количество изображений в превью-области по горизонтали
var LV:Number = 10;//расстояние между превью-изображеними по вертикали
var LH:Number = 10;//расстояние между превью-изображеними по горизонтали
var prevX:Number = 10;//координата X левого-верхнего угла прьевью-области
var prevY:Number = 200;//координата Y левого-верхнего угла превью-области
//************************************************************************************************

//************************************************************************************************
//        ВСПОМОГАТЕЛЬНЫЕ ПЕРЕМЕННЫЕ
//************************************************************************************************
var lastClipName = null;//имя клипа по которому последний раз был произведен клик мышью
var lastMCIndex = 0;//последний, проверенный на загруженность, клип
//************************************************************************************************

this.createEmptyMovieClip("photoMC", this.getNextHighestDepth());//создаем полномасштабную область просомтра
var mcl:MovieClipLoader = new MovieClipLoader();//создаем загрузчик
var mclL:Object = new Object();//создаем слушатель событий загрузчика
mcl.addListener(mclL);//назначаем слушателем событий загрузчика объект mclL

//процедура, определяющая основные характеристики текущего загруженного клипа, включая
//его местоположение в превью-области его габариты, сохранение характеристик загруженного
//изображения в свойствах клипа, последовательную визуализацию загруженных клипов,
//уничтожение выделенных ресурсов.
mclL.onLoadInit = function(target:MovieClip):Void
{
        target.realWidth = target._width;
        target.realHeight = target._height;
        target.flagLoaded = true;
        target._width = prevWidth;
        target._height = prevHeight;
        indexMC = Number(target._name);
        target._x = (indexMC-Math.floor(indexMC/prevHCount)*prevHCount)*(prevWidth+LV)+prevX;
        target._y = Math.floor(indexMC/prevHCount)*(prevHeight+LH)+prevY;
        target._visible = false;
        orderedVisualization(target);
        target.onPress = renderBMP;
        if (imgCounter==N)
        {
                mcl.removeListener(mclL);
                delete mclL;
                delete mcl;
        }
        imgCounter++;
}

//процедура, выполняющая рендеринг загруженного клипа в полномасштабную область посмотра,
//клипа на котором был произведен клик мышью
function renderBMP():Void
{
                var photoBMP:BitmapData = new BitmapData(this.realWidth, this.realHeight, false, 0x000000);
                photoMC.attachBitmap(photoBMP,10,"auto",true);
                photoMC._x = photoX;
                photoMC._y = photoY;
                photoMC._width = photoWidth;
                photoMC._height = photoHeight;
                photoBMP.draw(this,new Matrix(),null,"normal",null,true);
                if (lastClipName!=null)
                {
                        lastClipName._alpha = 100;
                }
                this._alpha = 50;
                lastClipName = this;
}

//процедура последовательной визуализации загруженных клипов
function orderedVisualization(target):Void
{
        for (var i:Number=lastMCIndex; i<=N-1; i++)
        {
                if (target._parent[i].flagLoaded)
                {
                        if (!target._parent[i]._visible)
                        {
                                target._parent[i]._visible = true;
                        }
                }else
                {
                        lastIndex = i;
                        break;
                }
        }
}


//главная процедура создания превью-клипов и инициализации загрузки в них изображений
function loadImg():Void
{
        for (var i:Number = 0; i<=N-1; i++)
        {
                this.createEmptyMovieClip(i, this.getNextHighestDepth());
                this[i].flagLoaded = false;
                mcl.loadClip("photos/"+(i+1)+".jpg",this[i]);
        }
}

loadImg();//вызов главной процедуры



Его преимущества:

1. Независимые друг от друга загрузки изображений (параллельная загрузка), в связи с чем, загрузка осуществляется быстро;
2. Несмотря на параллельную загрузку изображений вывод их превью-аналогов в превью-область производится последовательно слева-направо и сверху вниз, а не хаотично, в зависимости от размера изображения;
3. Вы имеете возможность работать с уже загруженными изображениями пока другие грузятся;
4. Размер превью-изображений и полномасштабных изображений не зависит от геометрических размеров загружаемых изображений, т.е. изображения любых размеров "втиснутся" в области просмотра;
5. Легкость настройки и управления;
6. Относительная простота и структурированность кода. Это улучшает его читабельность и облегчает работу с кодом по его оптимизации и рефакторингу.

Недостатки:

1. Код носит базовый, не законченный характер, т.е. отсутствует код обуславливающий дизайнерские аспекты, такие как твиннинг, обрамление превью-изображений при клике на них, итд.
2. Визуализация превью-изображений хоть и происходит последовательно, но рывками в зависимости от размеров изображений.

Обязательно тестите приложение в режиме моделирования загрузки - увидите в чем разница между этим приложением и обычным загрузчиком.

Надеюсь код поможет. Удачи!


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

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