PDA

Просмотр полной версии : Доступ к свойствам загруженной SWFки


vgl
01.03.2006, 08:19
Приветствую!
Решаю такую задачку:
Необходимо загрузить SWFку, содержащую векторное изображение, а затем по запросу отобразить это изображение, динамически меняя его высоту.
1. Использую MovieClipLoader для загрузки. Создаю пустой клип и в него гружу.
2. На этапе загрузки без проблем изменяю ширину через обращение к target_mc в .onLoadInit.
3. Потом ложу на нижний, невидимый слой и по необходимости перевожу на верхний видимый.
4. ... а вот тут и возникает проблема. Не удается изменит параметр _height т.к. я обращаюсь через "пустой" клип в который загружена SWFка, а у него выста 0. Т.е. видимо надо как-то добратся до свойств самой картинки... пробовал ссылатся на нее всеми способами, игрался с _lockroot, но все безрезультатно:(
Подскажите, как грамотнее решить эту задачку :rolleyes:

breez38
01.03.2006, 09:41
Изменять размеры мувиклипа через _width и _height нельзя. Можно только масштабировать мувик при помощи _xscale и _yscale. Они задаются в процентах, где 100% - оригинальный размер.

Например, если тебе нужно скажем увеличить высоту на 20 пикселей то можно написать так:

my_mc._yscale = (my_mc._width + 20) * 100 / my_mc._width;

Это приведет к "растягиванию" мувиклипа по высоте.

vgl
01.03.2006, 10:02
Изменять размеры мувиклипа через _width и _height нельзя. Можно только масштабировать мувик при помощи _xscale и _yscale. Они задаются в процентах, где 100% - оригинальный размер.

Например, если тебе нужно скажем увеличить высоту на 20 пикселей то можно написать так:

my_mc._yscale = (my_mc._width + 20) * 100 / my_mc._width;

Это приведет к "растягиванию" мувиклипа по высоте.

Спасибо! Я стока бился с _height, а оказывается она впринципе видимо успехе не принесла бы. :D

meiciuc
01.03.2006, 10:39
_height & _width тоже прекрасно можно ипользовать дял измениения размеров клипа. Просто надо было обращаться к новому загруженному клипу по имени старого клипа. т.е. какже как и в случае my_mc._yscale
только было бы my_mc._height = ...

breez38
01.03.2006, 10:48
to meiciuc
мда... действительно то же можно и через _height и _width... только почему у меня это раньше не работало - понять не могу :confused:

meiciuc
01.03.2006, 11:01
не работало только потому, что была неверная адресация. Уверен, помог пример breez38.

vgl
01.03.2006, 11:13
не работало только потому, что была неверная адресация. Уверен, помог пример breez38.
А у меня не работает. Размер загруженной внутрь "пустого" клипа my_mc SWFки меняется тока через масштабирование.

my_mc._height = 400;
trace(my_mc._height);

Выдаст 0;

а когда делал my_mc._yscale = 400 то все замечательно растянулось в 4 раза.

meiciuc
01.03.2006, 12:49
my_mc._height = 400;
trace(my_mc._height);

Выдаст 0;


все правильно, просто в тот момент целевой клип еще пустой, о если он пустой, то и размеры у него соответсвующие - хоть 1000000 пикселей ему задай. Размеры через _height & _width можно задавать лишь после проверки на наличие загруженного клипа.

meiciuc
01.03.2006, 13:02
кстати, использование события onLoadComplete - к сожалению, не панацея. Попробуй проанализировать trace из хелпового примера по этому событию. Если ты грузишь клип с локальной машины, то получишь

>> loadListener.onLoadComplete()
>> =============================
>> target_mc._width: 0
>> httpStatus: 0
>> loadListener.onLoadInit()
>> =============================
>> target_mc._width: 115


loadListener.onLoadComplete() был вызван раньше, чем loadListener.onLoadInit() - это первое, но этое ерунда. Хуже другое


>> loadListener.onLoadComplete()
>> =============================
>> target_mc._width: 0


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

KidsKilla
01.03.2006, 13:04
Чилавеки. onLoadInit происходит как правило до onLoadComplete. а высоту менять у того что ещё не загрузилось бессмысленно...

vgl
01.03.2006, 13:09
Я делал дополнительную задержку, и снова пытался тестить размеры клипа. Получив результат, отличный от нуля, уже пользовал клип, как было нужно.

Ясно. Спасибо за разъяснения. Впринципе задержка конечно вариант, но лучше было бы иметь какое-то событие, по которому можно было бы иметь полный доступ к ресурсам загруженного клипа. Формально это .onLoadComplete() но из твоего опыта выходит, что это тоже не совсем то:(

Так что в своей задаче я использовал _yscale :)

meiciuc
01.03.2006, 13:35
как правило
вот-именно. Но если грузить что-то маленькое и с локальной машины, то результат trace будет тот, что выше. Вероятно, события происходят практически одновременно, и обрабатываются по приоритету (по аналогии с аппаратными прерываниями) - но, как я заметил выше, к данной теме это отношение не имеет, да и в реальной работе onLoadInit() будет приходить чаще всего раньше.

__i
01.03.2006, 13:43
блин народ вы че все сговорились? хелп прочитать слабо?


When you use the onLoadComplete and onLoadInit events with the MovieClipLoader class, it’s important to understand how this differs from the way they work with your SWF file. The onLoadComplete event is called after the SWF or JPEG file has loaded, but before the application has been initialized. At this point it is impossible to access the loaded movie clip’s methods and properties, and because of this you cannot call a function, move to a specific frame, and so on. In most situations, it’s better to use the onLoadInit event instead, which is called after the content has loaded and is fully initialized.


onLoadComplete ВСЕГДА наступает раньше чем onLoadInit !!!
проблемы с установкой размеров у тя 100% не из за этого, гдето сидит бок а где из твоего кода не видно !
как вариант дай 1 онЕнтерФрем после onLoadInit своему мувику на раздупление.

KidsKilla
01.03.2006, 13:46
как правило
вот-именно. Но если грузить что-то маленькое и с локальной машины, то результат trace будет тот, что выше. Вероятно, события происходят практически одновременно, и обрабатываются по приоритету (по аналогии с аппаратными прерываниями) - но, как я заметил выше, к данной теме это отношение не имеет, да и в реальной работе onLoadInit() будет приходить чаще всего раньше.
событие onLoadInit происходит после и-ни-ци-а-ли-за-ции (слово трудное) первого кадра мувика, в который всё дело грузится. а это событие происходит после загрузки практически чего-бы-то-ни-было с локального компа, т.к. в локале что-бы-то-ни-было загружается уже в начале след. кадра.

мне кажется что мувик-таргет попросту убивается и создаётся снова. о чём говорит то что если ты в мувике задашь переменную и в него мувиклиплоадером начнёшь грузить переменной не будет.

KidsKilla
01.03.2006, 13:46
onLoadComplete ВСЕГДА наступает раньше чем onLoadInit !!!
в 8ке.


onLoadInit = function([target_mc:MovieClip]) {}
Invoked when the actions on the first frame of the loaded clip have been executed.

__i
01.03.2006, 13:51
ты внимательно прочел цитату из хелпа?, или тебе ее на русский перевести?

__i
01.03.2006, 13:56
onLoadInit = function([target_mc:MovieClip]) {}
Invoked when the actions on the first frame of the loaded clip have been executed.

не вырывай предложения из контекста, следующее предложение:

After this listener has been invoked, you can set properties, use methods, and otherwise interact with the loaded movie.

meiciuc
01.03.2006, 14:51
для __i. Действительно, справедливо - "век живи - век учись". Что значит просто строить выводы исходя только из имени метода. Можно наверное только добавить, что если клип состоит более, чем из одного фрейма, то onLoadInit произойдет раньше, чем onLoadComplete - впрочем, это уже очевидно. Но для однофреймовых клипов onLoadInit - это круто.

__i
01.03.2006, 14:59
ну на счет
что если клип состоит более, чем из одного фрейма то onLoadInit произойдет раньше, чем onLoadComplete - впрочем, это уже очевидно
с этим можно поспорить, вернее очевидно это сказать нельзя нужно протестировать ручками! вероятнее всего что это не так! Если исходить из слов хелпа что это утверждение не верно!

KidsKilla
01.03.2006, 15:52
в 7ке и 8ке суть onLoadInit поменялась.
даже тестовый код из хелпа стал другой.
в 8ке onLoadInit стабильно после загрузки в 7ке -- нет.

meiciuc
01.03.2006, 16:46
протестировал - загрузил сложный клип размером 50кБ. Результат тот-же. Зачем тогда нужен onLoadComplete? Разве только для организации счетчика регистрации загрузки кучи клипов, при условии позднейшего их использования.