Форум 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)
-   -   loadMovie("1.jpg") - как узнать размер картинки? (http://www.flasher.ru/forum/showthread.php?t=116867)

dashaaa 13.10.2008 03:46

loadMovie("1.jpg") - как узнать размер картинки?
 
Создаю пустой MovieClip, загружаю туда картинку:
Код:

public function loadImg():Void {
this.createEmptyMovieClip("empty_mc",1);
this["empty_mc"].loadMovie(this._name+".jpg");
trace(this["empty_mc"]._width);
}

Trace() отвечает "0"
Вопрос - как узнать размер картинки? (нужно чтобы расположить её по центру родительского мувиклипа - может есть способ проще?)
Вопрос 2 - если файла this._name+".jpg" не существует в Output вылетает сообщение об этом - можно ли как-то это сообщение поймать-отследить?

Mur4ik 13.10.2008 05:03

Я так понимаю это кусочек класса...
Вы пытаетесь узнать размеры клипа когда он еще не успел загрузится, поэтому и 0 выводится в трейсе.
Иными словами если Вы пишете trace(...) сразу после loadMovie() это не значит что трейс выполнится после отработки этой функции... так уж устроен as (асинхронное выполнение кода).
Т.е Вам нужно сначала убедится что картинка загрузилась, а потом проводить с ней какие-либо манипуляции. Сделать это можно используя класс MovieClipLoader, у него есть событие onLoadInit, которое срабатывает после загрузки контента, собственно в функции обработчике этого события и нужно узнавать ширину мувика.

Вот пример использования этого класса
Код:

// создаем экземпляр MovieClipLoader
var mclLoader:MovieClipLoader = new MovieClipLoader();

// слушатель загрузки картинок
var oLoadListener:Object = new Object();

// вешаем слушатель к MovieClipLoader
mclLoader.addListener(oLoadListener);

// обрабатываем ошибки возникающие при загрузке
function onLoadError(mcTarget:MovieClip, sErrorCode:String):Void
{
        if (sErrorCode == "URLNotFound")
        {
                // если файл не найден, то о чем Вы спрашивали
                trace("ERROR: File not found.");
                // или можно алерт выдать какой нибудь
        }
        else if (sErrorCode == "LoadNeverCompleted")
        {
                trace("ERROR: Load failed.");
        }
        else {
                trace("Load error: " + sErrorCode);
        }
}

// это функция выполнится когда начнется загрузка изображения
oLoadListener.onLoadStart = function(mcTarget:MovieClip):Void
{
        // тута код если чтото нужно делать при старте загрузки картинки
        // например отобразить прелоадер или еще каку нить х...ню

        trace("началась загрузка " + mcTarget);
};

// эта выполняется регулярно пока изображение не загрузится
oLoadListener.onLoadProgress = function(mcTarget:MovieClip, nBytesLoaded:Number, nBytesTotal:Number):Void
{
    // тута код для прелоадера на картинку
        trace(Math.round((nBytesLoaded / nBytesTotal) * 100 + " %" + mcTarget + "загружено");
};

// эта выполнится после полной загрузки картинки
oLoadListener.onLoadComplete = function(mcTarget:MovieClip):Void
{
        trace("закончилась загрузка " + mcTarget);
        // вот тут узнаем ширину загруженной картинки
        trace("И его ширина: " + mcTarget._width);

};

// тут код загрузки картинки или swf файла
// mcHolder - клип-контейнер в котором создается пустой мувик
// и в него уже загружается что-либо

mcHolder.createEmptyMovieClip("mcImage", mcHolder.getNextHighestDepth());
// загружаем что-либо
mclLoader.loadClip("имя_фала.ршр", mcHolder.mcImage);

По второму вопросу есть плагин к FireFox Flash Tracer который показывает все трейсы от флешки при наличии debug флеш-плеера.

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

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

dashaaa 13.10.2008 11:12

Вот это да! Спасибо большое - всё предельно понятно! Проблема исчерпана %))

dashaaa 23.10.2008 13:38

Интересно, когда мы что-либо загружаем в пустой мувиклип, его размер подстраивается под размер содержимого? Похоже нет, т.к. эта фукция
Код:

oLoadListener.onLoadComplete = function(mcTarget:MovieClip):Void
{
        trace("закончилась загрузка " + mcTarget);
        // вот тут узнаем ширину загруженной картинки
        trace("И его ширина: " + mcTarget._width);
};

отвечает, что его ширина 0
А как сделать, чтобы ширина мувиклипа была такая же как ширина картинки?
Или как узнать ширину картинки?

Mur4ik 23.10.2008 14:53

Размер пустого мувика подстраивается под размеры загруженного в него контента,
просто нужно узнавать ширину и вообще какие либо манипуляции с клипом в событии onLoadInit, ниже исправленный код (там и несколько грамматических/синтаксических ошибочек было)

Код:

// создаем экземпляр MovieClipLoader
var mclLoader:MovieClipLoader = new MovieClipLoader();

// слушатель загрузки картинок
var oLoadListener:Object = new Object();

// вешаем слушатель к MovieClipLoader
mclLoader.addListener(oLoadListener);

// обрабатываем ошибки возникающие при загрузке
function onLoadError(mcTarget:MovieClip, sErrorCode:String):Void
{
        if (sErrorCode == "URLNotFound")
        {
                // если файл не найден, то о чем Вы спрашивали
                trace("ERROR: File not found.");
                // или можно алерт выдать какой нибудь
        }
        else if (sErrorCode == "LoadNeverCompleted")
        {
                trace("ERROR: Load failed.");
        }
        else {
                trace("Load error: " + sErrorCode);
        }
}

// это функция выполнится когда начнется загрузка изображения
oLoadListener.onLoadStart = function(mcTarget:MovieClip):Void
{
        // тута код если чтото нужно делать при старте загрузки картинки
        // например отобразить прелоадер или еще каку нить х...ню

        trace("началась загрузка " + mcTarget);
};

// эта выполняется регулярно пока изображение не загрузится
oLoadListener.onLoadProgress = function(mcTarget:MovieClip, nBytesLoaded:Number, nBytesTotal:Number):Void
{
    // тута код для прелоадера на картинку
        trace(Math.round(nBytesLoaded / nBytesTotal * 100) + " %" + mcTarget + "загружено");
};

// эта выполнится после полной загрузки картинки
oLoadListener.onLoadInit = function(mcTarget:MovieClip):Void
{
        trace("закончилась загрузка " + mcTarget);
        // вот тут узнаем ширину загруженной картинки
        trace("И его ширина: " + mcTarget._width);

};

// тут код загрузки картинки или swf файла
// mcHolder - клип-контейнер в котором создается пустой мувик
// и в него уже загружается что-либо

mcHolder.createEmptyMovieClip("mcImage", mcHolder.getNextHighestDepth());
// загружаем что-либо
mclLoader.loadClip("имя_фала.ршр", mcHolder.mcImage);

Только учтите что на сцене уже должен быть клип mcHolder, т.к. мы в нем создаем пустой клип...
Если нужно грузить сразу в пустой мувик который создаете, то нужно подправить место загрузки примерное так:
Код:

this.createEmptyMovieClip("mcImage", this.getNextHighestDepth());
// загружаем что-либо
mclLoader.loadClip("имя_фала.ршр", mcImage);


Xero201 07.12.2008 03:39

А можно ли как-нибудь отловить событие полной загрузки мувика если используется функция attachMovie()? А то в "аттачиваемом" мувике хранятся переменные для его дальнейшей настройки, но в нужный момент времени они еще не загружены:(. Если кто знает, помогите пожалуйста.

iNils 07.12.2008 03:52

Метод attachMovie не загружает мувиклип, он берет символ из библиотеки. И до первого применения, узнать переменные внутри символа нельзя.

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

Xero201 07.12.2008 15:47

Ух ты! отправил сообщение в полпервого ночи, и через 10 минут уже получил ответ!!! Причем очень нужный!!! Спасибо большое!

Цитата:

И до первого применения, узнать переменные внутри символа нельзя.
Да, точно. Когда щелкаю по мувику, все его значения уже известны. А вот до этого ни в какую. Я думал что это связанно с загрузкой :rolleyes:.

Цитата:

Можно присвоить этому символу класс, и указать данные как статические свойства класса, тогда их можно будет использовать в любой момент.
Ох, вряд ли это получится. Ведь в мувике около 25 кадров, в каждом из котрых указаны свои значения параметров. В зависимости от значения параметров, зависит сколько еще мувиков надо добавить. Т.е. код следующий:
Код AS1/AS2:

//в одном из кадров мувика ("х")
var Des = {count:7}; //указывает на то, сколько еще нужно добавить мувиков
 
//в коде добавления мувиков
CountSize = 1// в самом начале известно что нужно добавить как минимум один мувик
 
for (var i = 0; i<CountSize; ++i){
 
var newName:String = eval("obj")+i; //имя для добавляемого элемента
place.attachMovie(eval("obj"), newName, i+spec_depth, eval("obj")); //вставляем элемент в указанное место
 
if(CountSize == 1){ //если количество мувиков еще не известно, узнать его
place[newName].gotoAndStop("х"); //перевод мувика на заданный кадр
CountSize =i+place[newName].Des.count; // !!!!undefined!!!!
}
//другие операции
}

А как можно сымитировать применение мувика? А то пробовал вызывать при его добавлении туже функцию, что вызывается при нажатии по нему, но она срабатывает только во-втором случае:(. Наверное потому, что в качестве "применения" выступает именно onPress, а не функции им вызываемые.

Xero201 12.12.2008 20:50

Что, ребята, неужели никто не знает как имитировать нажатие кнопки?-(

Gigo 06.07.2009 16:49

А как можно загрузить несколько изображений в цикле что бы все показывались? а то у меня получаеться что только один показывает (последний)


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

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