![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Sep 2006
Сообщений: 89
|
Всем доброго времени суток
возник вопрос, можно ли повесить листенер на мувик и слушать что-то типа onResize? Т.е. если ресайзится мувик, чтобы что-то выполнялось. Хочется такое делать из классов, например, скроллера, которые должен ресайциться под маску. Или скроллер слушал размер текста и отключался, елси высота текста меньше маски... В хелпе addListener вроде можно повесить на любой объект, но если делать movieClip.addListener(Object), то onResize у Object'a не вызывается... Можно конечно прописать руками setInterval и смотреть что высота/ширина не изменилась, но как-то кажется это решение не очень оптимальным... Спасибо за совет. |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Вы простите конечно, но разве мувик может ресайзится сам? Его ресайзит программа, написанная Вами. Кому как не ей знать, КАК она его ресайзит?
__________________
Reality.getBounds(this); |
|
|||||
|
Регистрация: Sep 2006
Сообщений: 89
|
Это то понятно, просто проще нацепить "слушателя" и не думать в каких ситуациях может заресайзиться мувик. У меня сильное общущение что так правильнее, ибо в моем случае ресайзить может при изменении текста и ресайзе сцены...
Да и с точки зрения ООП, думаю, для написания отдельного класса это правильно. Ибо если класс принемает ссылку на мувик и должен подстраиваться под размеры мувика, то он не может и не должен знать почему мувик изменился снаружи, он просто должен на это отреагировать... Иначе код класса уже не будет достаточным, придется где-то вызывать дополнительно его методы myOnResize и т.д. Последний раз редактировалось Denis Davidov; 01.06.2008 в 03:48. |
|
|||||
|
Регистрация: Sep 2006
Сообщений: 89
|
Ок, с addListener понятно, работает только со Stage.
все-таки возвращаясь к изначальному вопросу, можно как-то слушать изменение размера мувика из класса? |
|
|||||
|
2 варианта:
1) ты пишешь программу сам, которая ресайзит мувик (встроенных нету). Там уже нужно действовать руками и писать все самому. 2) если у тебя showAll=true, тогда мувик будет ресайзиться при ресайзе флэшки, то есть как писал iNils:
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Вы могли бы привести примеры стандартных событий, происходящих в программе, а не в плеере (как события мыши, окна, загрузки данных и т.д.) ? Я сходу не могу, но у меня и знаний маловато. По-моему всё что происходит в программе, контролируется программой. У любого ресайза есть причина. Изменение текстового поля происходит при загрузке в него текста, добавлении символов руками (для отслеживания этого есть стандартное событие) или изменение текста в результате действия программы. Т.е. Вы всегда знаете, в какой момент текстовое поле изменилось, и можете устроить проверку его размеров. А создавать интервал опроса размеров или запрашивать их на onEnterFrame - совершенно неоправданная нагрузка на проц. Вы можете предусмотреть в своем классе метод, производящий изменения в зависимости от размеров, и вызывать этот метод извне тогда же, когда меняете его размер. Я вижу только одну альтернативу - опрос с интервалом. Но я бы никогда так не стал делать.
__________________
Reality.getBounds(this); |
|
|||||
|
Modus ponens
|
/**
* ...
* @author wvxvw
*/
class SomeClass extends MovieClip
{
public var broadcastMessage:Function;
public var addListener:Function;
public var removeListener:Function;
public function SomeClass()
{
_global.AsBroadcaster.initialize(this);
super();
}
public function get x():Number {
return _x;
}
public function set x(n:Number):Void {
_x = n;
broadcastMessage("onResize", "x", _x);
}
// this won't move the clip to new _y position, super._y points nowhere... :(
public function get _y():Number {
return super._y;
}
public function set _y(n:Number):Void {
super._y = n;
broadcastMessage("onResize", "_y", super._y);
}
}
*bbb - инстанс SomeClass'а (клипа в библиотеке с линкейджем к этому самому классу) выложеный на сцену* import SomeClass;
var abc:SomeClass = SomeClass(bbb);
abc.addListener(this);
onResize = function(prop:String, newVal:Number):Void {
trace("Instance of SomeClass changed property: "+prop+" to "+newVal);
}
abc.x = 100;
Но, вообще, удобнее пользоваться EventDispatcher'ом =) Хреново то, что оверрайда нету для свойств типа _х/_у и т.п... т.е. можно создать классу свойства с такими же именами, но тогда до "родных мувиклиповых" _х/_у уже будет недостучаться... Есть еще вариант: можно не линковать класс к клипу в библиотеке, а аттачить клип, ну, скажем, в конструкторе, тогда в гет/сет можно будет обращаться не к super, а к этому приаттаченому клипу (я обычно именно так и делаю), тогда и гет/сет можно будет назвать _х/_у и т.п. Но дальше проблема может возникнуть в том, что по-настоящему приватных переменных в АС2 нету, и какой-нибудь другой класс сможет обратиться напрямую к клипу (а не через гет/сет) и события не воникнет...
__________________
Hell is the possibility of sanity Последний раз редактировалось wvxvw; 01.06.2008 в 12:45. |
|
|||||
|
Регистрация: Sep 2006
Сообщений: 89
|
Спасибо все за участие в теме.
Что-бы немного придать конкретики, речь идет о текстовом поле под маской с рускопысным скролл-баром (от Wolsh'а). есть 2 вещи, кот. я в данном конкретном случае хочу решить: 1) маска слушает сцену и ресайцится. скрол бар должен ресайзится после маски (под ее новый размер), т.е. просто слушать onResize Stag'а не выход. Тем более если ресайзить независимо, то придется дублировать код для маски и скрола (одна и та-же зависимость например высоты от высоты Stage'a, что неприемлемо). навешивать на onResize у маски callBack чтобы ресайзить скролл -- думаю лишний гемор. Хотя можно и последовательность ресайзов будет правильная... 2)при изменении текстового поля, бегунок скрола должен реагировать (увеличиваться/уменьшаться/или совсем блокироваться). С этим проще, ибо изменение поля происходит при нажатии на меню, т.е. туда теоретически можно засунуть вызов функции scroll'а, это не сложно... Но мне как-то ближе вариант описанный wvxvw. Попробую с этим поэкспериментировать... 2wvxvw: посмотрел EventDispatcher, что-то там мало примеров, я так понял надо примерно так: Как то так? чем EventDispatcher лучше чем то, что Вы описали? |
|
|||||
|
Если текстовое поле - то оно будет менять свои размеры с каждым новым введенным символом... Ну, почти при каждом, условие проверки на то, изменилось ли величина поля будет проходить дольше. чем новый просчет её ширины/высоты, имхо...
__________________
Тут мужик танцует и поёт про флэш |
![]() |
![]() |
Часовой пояс GMT +4, время: 10:58. |
|
|
« Предыдущая тема | Следующая тема » |
|
|