Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 01.06.2008, 03:10
Denis Davidov вне форума Посмотреть профиль Отправить личное сообщение для Denis Davidov Найти все сообщения от Denis Davidov
  № 1  
Ответить с цитированием
Denis Davidov

Регистрация: Sep 2006
Сообщений: 89
По умолчанию слушать onResize но для мувика (существует?)

Всем доброго времени суток

возник вопрос, можно ли повесить листенер на мувик и слушать что-то типа onResize? Т.е. если ресайзится мувик, чтобы что-то выполнялось.
Хочется такое делать из классов, например, скроллера, которые должен ресайциться под маску. Или скроллер слушал размер текста и отключался, елси высота текста меньше маски...

В хелпе addListener вроде можно повесить на любой объект, но если делать
movieClip.addListener(Object), то onResize у Object'a не вызывается...

Можно конечно прописать руками setInterval и смотреть что высота/ширина не изменилась, но как-то кажется это решение не очень оптимальным...
Спасибо за совет.

Старый 01.06.2008, 03:31
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 2  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Вы простите конечно, но разве мувик может ресайзится сам? Его ресайзит программа, написанная Вами. Кому как не ей знать, КАК она его ресайзит?
__________________
Reality.getBounds(this);

Старый 01.06.2008, 03:44
Denis Davidov вне форума Посмотреть профиль Отправить личное сообщение для Denis Davidov Найти все сообщения от Denis Davidov
  № 3  
Ответить с цитированием
Denis Davidov

Регистрация: Sep 2006
Сообщений: 89
Это то понятно, просто проще нацепить "слушателя" и не думать в каких ситуациях может заресайзиться мувик. У меня сильное общущение что так правильнее, ибо в моем случае ресайзить может при изменении текста и ресайзе сцены...

Да и с точки зрения ООП, думаю, для написания отдельного класса это правильно. Ибо если класс принемает ссылку на мувик и должен подстраиваться под размеры мувика, то он не может и не должен знать почему мувик изменился снаружи, он просто должен на это отреагировать...
Иначе код класса уже не будет достаточным, придется где-то вызывать дополнительно его методы myOnResize и т.д.


Последний раз редактировалось Denis Davidov; 01.06.2008 в 03:48.
Старый 01.06.2008, 04:26
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 4  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,884
Записей в блоге: 7
addListener - это метод класса Stage, а не мувиклипа. И он заносит объект в скобках в слушатели Stage, и рассылтает ему событие. Поэтому правильно писать так ():
Код:
Stage.addListener(this);
this.onResize = function (){}
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 01.06.2008, 10:40
Denis Davidov вне форума Посмотреть профиль Отправить личное сообщение для Denis Davidov Найти все сообщения от Denis Davidov
  № 5  
Ответить с цитированием
Denis Davidov

Регистрация: Sep 2006
Сообщений: 89
Ок, с addListener понятно, работает только со Stage.
все-таки возвращаясь к изначальному вопросу, можно как-то слушать изменение размера мувика из класса?

Старый 01.06.2008, 10:48
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 6  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,601
Записей в блоге: 17
2 варианта:
1) ты пишешь программу сам, которая ресайзит мувик (встроенных нету). Там уже нужно действовать руками и писать все самому.
2) если у тебя showAll=true, тогда мувик будет ресайзиться при ресайзе флэшки, то есть как писал iNils:
Код:
Stage.addListener(this);
this.onResize = function (){}

Старый 01.06.2008, 11:14
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 7  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Вы могли бы привести примеры стандартных событий, происходящих в программе, а не в плеере (как события мыши, окна, загрузки данных и т.д.) ? Я сходу не могу, но у меня и знаний маловато. По-моему всё что происходит в программе, контролируется программой. У любого ресайза есть причина. Изменение текстового поля происходит при загрузке в него текста, добавлении символов руками (для отслеживания этого есть стандартное событие) или изменение текста в результате действия программы. Т.е. Вы всегда знаете, в какой момент текстовое поле изменилось, и можете устроить проверку его размеров. А создавать интервал опроса размеров или запрашивать их на onEnterFrame - совершенно неоправданная нагрузка на проц. Вы можете предусмотреть в своем классе метод, производящий изменения в зависимости от размеров, и вызывать этот метод извне тогда же, когда меняете его размер. Я вижу только одну альтернативу - опрос с интервалом. Но я бы никогда так не стал делать.
__________________
Reality.getBounds(this);

Старый 01.06.2008, 11:56
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 8  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Код:
/**
* ...
* @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.
Старый 01.06.2008, 12:59
Denis Davidov вне форума Посмотреть профиль Отправить личное сообщение для Denis Davidov Найти все сообщения от Denis Davidov
  № 9  
Ответить с цитированием
Denis Davidov

Регистрация: Sep 2006
Сообщений: 89
Спасибо все за участие в теме.
Что-бы немного придать конкретики, речь идет о текстовом поле под маской с рускопысным скролл-баром (от Wolsh'а). есть 2 вещи, кот. я в данном конкретном случае хочу решить:
1) маска слушает сцену и ресайцится. скрол бар должен ресайзится после маски (под ее новый размер), т.е. просто слушать onResize Stag'а не выход. Тем более если ресайзить независимо, то придется дублировать код для маски и скрола (одна и та-же зависимость например высоты от высоты Stage'a, что неприемлемо).
навешивать на onResize у маски callBack чтобы ресайзить скролл -- думаю лишний гемор. Хотя можно и последовательность ресайзов будет правильная...
2)при изменении текстового поля, бегунок скрола должен реагировать (увеличиваться/уменьшаться/или совсем блокироваться). С этим проще, ибо изменение поля происходит при нажатии на меню, т.е. туда теоретически можно засунуть вызов функции scroll'а, это не сложно...

Но мне как-то ближе вариант описанный wvxvw. Попробую с этим поэкспериментировать...
2wvxvw:
посмотрел EventDispatcher, что-то там мало примеров, я так понял надо примерно так:
Код:
__mask_mc.addEventListener("changeGeometry", myListener);
...
myListener.changeGeometry = function() {...}
__mask_mc.changeGeometry() {
   ...
   broadcastMessage("changeGeometry",_y,"_y",_x,"_x",...);
}
Как то так? чем EventDispatcher лучше чем то, что Вы описали?

Старый 01.06.2008, 14:02
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 10  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,601
Записей в блоге: 17
Если текстовое поле - то оно будет менять свои размеры с каждым новым введенным символом... Ну, почти при каждом, условие проверки на то, изменилось ли величина поля будет проходить дольше. чем новый просчет её ширины/высоты, имхо...

Создать новую тему Ответ Часовой пояс GMT +4, время: 11:44.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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