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

venegy 25.08.2007 02:32

Как достать ширину загруженной картинки?
 
Проблема в том, что трейс показывает НОЛЬ. Помогите.
Код:

_root.createEmptyMovieClip("imageHolder",1);
_root.imageHolder.loadMovie("image_1.jpg");
trace(_root.imageHolder._width);


udaaff 25.08.2007 03:04

Код:

this.createEmptyMovieClip("image_mc", this.getNextHighestDepth());
//
var mclListener:Object = new Object();
mclListener.onLoadInit = function(target_mc:MovieClip) {
        trace(target_mc._width)
};
//
var image_mcl:MovieClipLoader = new MovieClipLoader();
image_mcl.addListener(mclListener);
image_mcl.loadClip("asdf.jpg", image_mc);


Torero 25.08.2007 03:06

Скорее всего, проблема в том что ширина измеряется до того как изображение загружено. используй onLoad или SetInterval

venegy 25.08.2007 04:46

Постепенно подхожу к цели, но возникла следующая проблема: как достать значение ширины, чтобы использовать его вне функции loadImage?
Код:

function loadImage(mc, img){
/*        mc - куда кладем картинку,
        img - имя картинки для загрузки
        */
        var mclListener:Object = {};
        mclListener.onLoadInit = function(target_mc:MovieClip)
        {
                mclListener.onLoadInit.imgWidth = target_mc._width;
                trace(mclListener.onLoadInit.imgWidth); //здесь получаем ширину картинки, которую необходимо использовать извне (там, где уже вызывается функция loadImage)
        }
        mclListener.onLoadComplete = function()
        {
        delete image_mcl;// delete mclListener;
        }
        var image_mcl:MovieClipLoader = new MovieClipLoader();
        image_mcl.addListener(mclListener);
        image_mcl.loadClip(img, mc);}


Mr. Fixit 25.08.2007 13:10

venegy
ты сначала задай ширину пустому мувиклипу.

udaaff 25.08.2007 13:55

to Mr. Fixit: зачем?

to venegy: ты можешь узнать ширину мувика, только по наступлению события onLoadInit (т.е. картинка твоя не загружается мгновенно), вот и думай исходя из этого.

Wolsh 25.08.2007 15:47

Знаю, что это типа муветон, но я просто в _root переменную завожу или в _global. Соотв. пишешь в онЛоадИнит
Код:

_root.imgWidth = target_mc._width;
и дальше используешь ссылку _root.imgWidth

venegy 25.08.2007 16:12

Пробовал. Так не получается. Проблема как раз в том, что переменная не принимает нужные значения (onLoadInit отрабатывает позже, чем я обращаюсь к переменной...).
udaaff, ты намекал на что-то... Может, мне структуру функций переделать. Прежняя была такая:
loadImage(mc, img)
mc - куда кладем картинку,
img - имя картинки для загрузки
внутри неё - функция для обработчика onLoadInit (которая давала нужный мне параметр - ширину загружаемой картинки)

Далее я Вызываю первичную функцию loadImage(mc, img) в цикле для загрузки картинок. Но! Мне нужна ширина картинки. Накапливая ширину каждой загруженной картинки в переменную в этом цикле я получу возможность расставлять картинки одну за другой (в длинную колбасу). Может, изначально логика неверная? Спасибо за участие.

Wolsh 25.08.2007 17:00

>>onLoadInit отрабатывает позже, чем я обращаюсь к переменной

Тогда, простите, чью ширину Вы хотите использовать? Картинки-то еще нет
Да, логика неверная

Цикл выдает несколько тысяч итераций в секунду, т.е. Вы начнете грузить картинки одновременно, а вот время, за которое они будут загружаться, зависит от их веса. Таким образом шестая картинка может загрузиться раньше всех - куда Вы ее поставите, если ширина остальных еще не известна? Выход - грузить картинки по-очереди, не в цикле, а загружая следующую по событию онЛоадКомплит предыдущей. Или вар.2 - загрузить все картинки в одну пачку в невидимом мувике, сделать его видимым и пересчитать координаты всех картинок. Или вар.3 - отображать некие ячейки одного размера, возможно с прелоадером внутри, при окончании загрузки каждой картинки вызывается функция пересчета всей колбасы - получится динамическая такая загрузка :)

venegy 25.08.2007 18:29

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

Wolsh 25.08.2007 19:45

Как? Ну это зависит от того, где Вы берете имена (URL) картинок для загрузки... Ну допустим, стандартное решение - у Вас в _root есть массив all_images с урлами, полученный сплитом строки или из хмл-файла. Тогда вот этот блок
Код:

mclListener.onLoadComplete = function()
        {
        delete image_mcl;// delete mclListener;
        }

замените на
Код:

mclListener.onLoadComplete = function()
        {
        num++
        new_holder = _root.createEmptyMovieClip("mc"+num, num);
        image_mcl.loadClip(_root.all_images[num], new_holder);
        }

(я опускаю здесь проверку на последняя/непоследняя и объявление num=0, а также изменения кода для загрузки первой картинки из списка (сейчас-то у Вас код только для одной картинки) - с этим Вы легко разберетесь)

venegy 25.08.2007 19:56

Вложений: 1
Я победил! :victory:
Немного преобразовал вид и с помощью рекурсивного вызова функции loadImage(i) стал грузить картинки по очереди. Красиво работает. Рабочий архив в аттаче.
Всем спасибо!

udaaff 25.08.2007 23:39

Твой код, только в упрощенном варианте
Код:

loader(0, 1);
//
function loader(x0:Number, i:Number):Void {
        //
        var container:MovieClip = this.createEmptyMovieClip("tester_mc"+i, this.getNextHighestDepth());
        container._x = x0;
        //
        var mclListener:Object = new Object();
        mclListener.onLoadInit = function(target_mc:MovieClip) {
                // --- рекурсия
                loader(container._x+target_mc._width, ++i);
                //
        };
        var image_mcl:MovieClipLoader = new MovieClipLoader();
        image_mcl.addListener(mclListener);
        image_mcl.loadClip("image_"+i+".jpg", "tester_mc"+i);
}

:victory:

dreaman 01.09.2007 02:36

Цитата:

Сообщение от venegy
Я победил! :victory:
Немного преобразовал вид и с помощью рекурсивного вызова функции loadImage(i) стал грузить картинки по очереди. Красиво работает. Рабочий архив в аттаче.
Всем спасибо!

господа! вопрос такой: а как сделать скроллинг (вертикальный) для данной конструкции "слушателей"? всю голову изломал...

udaaff 01.09.2007 10:12

Уточните свой вопрос.

dreaman 01.09.2007 15:27

Цитата:

Сообщение от udaaff
Уточните свой вопрос.

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

Код:

onClipEvent(load){
_root.urllinkfon._visible=0;
var offset=10; i=1; dy=0;
function loadImage(i){
        var listener:Object={};
        listener.onLoadInit = function(target_mc:MovieClip)
                {
                target_mc._x = 10;
                target_mc._y = offset+dy;
                offset += target_mc._height+10;
               
////////////////////////////////////////////////// ROLL OVER
_root.urllinkfon._visible=100;
var mainfon:XML = new XML();
System.useCodepage = true;
mainfon.ignoreWhite = true;
mainfon.load("txt.xml");
mainfon.onLoad = function (success){
functxml(this);}
function functxml(xml:XML) {
.... zagruzka contenta iz XML........}

///////////////////////////// vot tut  nujen scroll ///////////////////////
if(_root.mainfon._ymouse>200 && _root.mainfon._xmouse<100){ 
        _root.onEnterFrame=function(){                                   
        trace(_root.mainfon._ymouse);                                           
                dy--;                                                             
        }                                                                           
}                                                                                   
else {break;}                                                                   
//////////////////////////////////////////////////////////////////////////
}}
////////////////////////////////////////////////// END ROLL OVER


                i++;
                loadImage(i);
                }
        listener.onLoadComplete = function()
                {
                image_mcl.loadClip(img,mc);
                }
        var image_mcl:MovieClipLoader = new MovieClipLoader();
        image_mcl.addListener(listener);
       
                current_mc="mc_"+i;
                current_img="mypict_"+i+".jpg";
                this.createEmptyMovieClip(current_mc, i);
                image_mcl.loadClip(current_img, this["mc_"+i]);
                trace("i"+i);
}
loadImage(i);
}


Wolsh 01.09.2007 15:45

Вы чтоже, все мувики с картинками прямо в руте создаете? Создавайте в специальном контейнере, его и скроллируйте потом. Можно сверху маску положить нужного размера.

dreaman 01.09.2007 16:46

спасибо, попробую сделать так=)

udaaff 01.09.2007 16:48

Можно также использовать свойство мувика scrollRect или компонент ScrollPane.

Wolsh 01.09.2007 17:29

udaaff, не подскажешь как в скроллпейн мувики засовывать НЕ ИЗ библиотеки, а динамически созданные? Не могу найти, уже был такой вопрос. Или предлагаешь приаттачить пустой из библиотеки и в него грузить? Да и полосы прокрутки эти... Неэстетично и куча возни с перерисовкой. Проще свой скролл написать, имхо.

etc 01.09.2007 17:34

ScrollPane, кажется, в качестве contentPath принимает и URL…

Wolsh 01.09.2007 17:58

Принимает, да, но ведь только один? И что с ним дальше делать? :) Здесь грузится много картинок и выстраивается в одну колбасу. Эту колбасу, понятно, надо скроллировать. udaaff предлагает воспользоваться скроллпейн. Мне интересно (теоретически) как? Я вижу только один вариант - пустой мувик из либы (ну если угодно, можно и с урла взять), а в нем уже через content создавать эти самые контейнеры под картинки. Мороки выше крыши - постоянно меняющийся размер контента например.
И по мне так это некрасиво, скроллпейн. Для галереи во всяком случае.

udaaff 01.09.2007 18:19

Порылся в help: "contentPath indicates the content to load into the scroll pane. This value can be a relative path to a local SWF or JPEG file, or a relative or absolute path to a file on the Internet. It can also be the linkage identifier of a movie clip symbol in the library that is set to Export for ActionScript." Т.е. мувик можно грузить только из библиотеки, но ничто потом не мешает сделать, так, как ты и предложил -- загрузить в него контент:
Код:

System.security.allowDomain("http://www.helpexamples.com");

this.createClassObject(mx.containers.ScrollPane, "my_sp", 10);
my_sp.setSize(100, 100);
my_sp.contentPath = "my_mcID";

var container_mc:MovieClip = my_sp.content;

var content_mc:MovieClip = container_mc.createEmptyMovieClip("mc", container_mc.getNextHighestDepth());
content_mc.loadMovie("http://www.helpexamples.com/flash/images/image1.jpg");


dreaman 01.09.2007 22:37

все равно не помогает, скроллится только последняя картинка... че делать?
Код:

loader(10, 0, 1);
//
function loader(x0:Number, y0:Number, i:Number):Void {
//
var container:MovieClip = this.createEmptyMovieClip("tester_mc"+i, this.getNextHighestDepth());
container._y = y0;
container._x = x0;
//
var mclListener:Object = new Object();
mclListener.onLoadInit = function(target_mc:MovieClip) {
// --- рекурсия
loader(container._x, container._y+target_mc._height+5, ++i);

//////////////////////////// vot tut///////////////////////////////
butt.onRollOver=function(){
butt.onEnterFrame=function(){
        container._y-=10;
        trace(container._y);
}}
butt.onRollOut=function(){
        delete eval (onEnterFrame);
}
////////////////////////////////////////////////////////////////////

};
var image_mcl:MovieClipLoader = new MovieClipLoader();
image_mcl.addListener(mclListener);
image_mcl.loadClip("mypict_"+i+".jpg", "tester_mc"+i);
}


udaaff 01.09.2007 23:00

В твоем коде никакой логики нету: при вызове функции создается контейнер, ссылка на него записывается в переменную container, и каждый раз ты записываешь в обработчик событий функцию
Код:

function() {
                                container._y -= 10;
                                trace(container._y);
                        };

и каждый раз, при очередном вызове функции loader, этот обработчик перезаписывается, в итоге получится, по идее, что у тебя будет перемещаться только последний контейнер при нажатии на кнопку. Не нужно, короче говоря, пихать вообще этот код
Код:

butt.onRollOver = function() {
                        butt.onEnterFrame = function() {
                                container._y -= 10;
                                trace(container._y);
                        };
                };
                butt.onRollOut = function() {
                        delete eval(onEnterFrame);
                };

в функцию. Создай контейнер в _root и в нем создавай субконтейнеры для картинок, а не в _root. Ну и прокручивай, соответственно, главный контейнер.

Больше всего меня интересует смысл этой строчки:
Код:

delete eval(onEnterFrame);

dreaman 01.09.2007 23:34

Цитата:

Сообщение от udaaff
Больше всего меня интересует смысл этой строчки:
Код:

delete eval(onEnterFrame);

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

udaaff 01.09.2007 23:57

Код:

var general:MovieClip = this.createEmptyMovieClip("general", this.getNextHighestDepth());
/*
  здесь: команды для передвижения general
*/
loader(0, 1);
//
function loader(x0:Number, i:Number):Void {
        //
        var container:MovieClip = general.createEmptyMovieClip("container"+i,general.getNextHighestDepth());
        container._x = x0;
        trace(container)
        //
        var mclListener:Object = new Object();
        mclListener.onLoadInit = function(target_mc:MovieClip) {
                // --- рекурсия
                loader(container._x+target_mc._width, ++i);
                //
        };
        var image_mcl:MovieClipLoader = new MovieClipLoader();
        image_mcl.addListener(mclListener);
        image_mcl.loadClip("image_"+i+".jpg", container);
}


dreaman 02.09.2007 00:27

респект, udaaff!!!
огромное спасибо, что помог разобраться


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

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