![]() |
|
||||||||||
|
|||||
|
[+3 18.04.11]
Регистрация: Dec 2010
Сообщений: 342
|
Возникла проблемка, как грамотно организовать работу кода. Вот простейший код, который помещен в прослушиватель события ENTER_FRAME:
private function onFrame(e:Event):void { if (rectSpr.height > stage.stageHeight / 2) addChild(_scrollBar); if (rectSpr.height < stage.stageHeight / 2) removeChild(_scrollBar); } А то у меня как-то все громоздко получается и некрасиво. Или же тут нужно собственные события создавать? |
|
|||||
|
Регистрация: Jun 2008
Адрес: курский вокзал
Сообщений: 1,114
|
Ну вообще-то бы надо на кастомное событие производить действие, то есть надо слушать тот объект, который может изменить rectSpr.Но если очень хочется на EnterFrame:
private var isAddedSB:Boolean; private function onFrame(e:Event):void{ if (rectSpr.height > stage.stageHeight / 2 && !isAddedSB) { isAddedSB = true; addChild(_scrollBar); } if (rectSpr.height < stage.stageHeight / 2 && isAddedSB) { isAddedSB = false; removeChild(_scrollBar); } } Короче говоря дофига вариантов, но EnterFrame явно не лучший.
__________________
Я просто добрый шутник. |
|
|||||
|
[+3 18.04.11]
Регистрация: Dec 2010
Сообщений: 342
|
Цитата:
![]() |
|
|||||
|
Регистрация: Jun 2008
Адрес: курский вокзал
Сообщений: 1,114
|
Колин Мук "Action Script 3.0 для Flash. Подробное руководство."
__________________
Я просто добрый шутник. |
|
|||||
|
[+3 18.04.11]
Регистрация: Dec 2010
Сообщений: 342
|
Уже несколько раз перечитываю. Он даже щас открыт у меня на главе Пользовательские события
![]() |
|
|||||
|
Регистрация: Jun 2008
Адрес: курский вокзал
Сообщений: 1,114
|
Кхм, давай рассуждать.Пока без всяких паттернов и проч.
Что у тебя может менять высоту rectSpr? Как вариант (не самый лучший, но все же): 1)создаешь свой класс наследник от Sprite и экземпляр этого класса и будет rectSpr 2)переопределяешь там heigth - override public function set height(value:Number){super.height=value;dispatchEvent(new Event('RESIZE'))} 4)добавляешь или удаляешь _scrollBar
__________________
Я просто добрый шутник. |
|
|||||
|
[+3 18.04.11]
Регистрация: Dec 2010
Сообщений: 342
|
rectSpr - тут у меня находится различный контент(height у всех разный), который изменяет свои размеры при наведении на него. Если height вылазит за пределы сцены, то появляется скроллер.
Правильно ли я понимаю, что в этом классе sprRect я должен диспетчеризировать свое событие? |
|
|||||
|
Регистрация: Jun 2008
Адрес: курский вокзал
Сообщений: 1,114
|
Ну к примеру:
Класс Main.as package { import flash.display.Graphics; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; /** * ... * @author Scarbo */ public class Main extends Sprite { public function Main() { var resizeSpr:ResizeSprite = new ResizeSprite(); resizeSpr.addEventListener(ResizeSprite.RESIZE, _resizeHandler); resizeSpr.addEventListener(MouseEvent.CLICK, _clickHandler); addChild(resizeSpr); // var g:Graphics = resizeSpr.graphics; g.clear(); g.beginFill(0x234acc); g.drawRect(0, 0, 100, 100); g.endFill(); } private function _clickHandler(e:MouseEvent):void { var resizeSpr:ResizeSprite = e.target as ResizeSprite; resizeSpr.height += 10; resizeSpr.width += 20; } private function _resizeHandler(e:Event):void { trace(e.type); } } } package { import flash.display.Sprite; import flash.events.Event; /** * ... * @author Scarbo */ public class ResizeSprite extends Sprite { public static const RESIZE:String = 'resize'; public function ResizeSprite() { super(); mouseChildren = false; } override public function set width(value:Number):void { super.width = value; dispatchEvent(new Event(RESIZE)); } override public function set height(value:Number):void { super.height = value; dispatchEvent(new Event(RESIZE)); } } } Но когда пишут скроллы, то обычно учитывается, что они будут работать с любым видим контентом, то есть сам скролл должен приспосабливаться под контент, а не наоборот.
__________________
Я просто добрый шутник. Последний раз редактировалось scarbo; 14.01.2011 в 01:44. |
|
|||||
|
[+3 18.04.11]
Регистрация: Dec 2010
Сообщений: 342
|
Понял зачем событие resizeSpr.addEventListener(ResizeSprite.RESIZE, _resizeHandler) только когда скомпилировал. То есть тут экземпляру класса присваивается новое значение высоты и ширины. И не надо ЭнтерФрэйм использовать.
Ладно... буду разбираться в своей огороде... |
|
|||||
|
Регистрация: Jun 2008
Адрес: курский вокзал
Сообщений: 1,114
|
Цитата:
Еще раз, зачем я сделал класс ResizeSprite? Чтобы можно было диспатчить(выкидывать) событие, когда у экземпляра этого класса(resizeSpr) изменится высота или ширина. var resizeSpr:ResizeSprite = new ResizeSprite(); Создали экземпляр класса. resizeSpr.addEventListener(ResizeSprite.RESIZE, _resizeHandler); Подписались на "слушание" "выкидывания" события 'resize', соответственно в функции _resizeHandler можно что-то делать, зная что эта функция вызывается только когда у resizeSpr изменяться размеры. resizeSpr.addEventListener(MouseEvent.CLICK, _clickHandler); тут и ниже - это просто пример кода, при клике мышью на resizeSpr, у него меняются размеры, как только они поменялись вызывается функция _resizeHandler. Еще фишка, если в коде ResizeSprite.as написать не так: dispatchEvent(new Event(RESIZE)); а вот так: dispatchEvent(new Event(RESIZE, true)); то можно наделать кучу resizeSpr, дальше подписаться на stage stage.addEventListener(ResizeSprite.RESIZE, _resizeHandler); и мы будем знать когда меняются размеры у любого из экземпляров ResizeSprite.
__________________
Я просто добрый шутник. Последний раз редактировалось scarbo; 14.01.2011 в 02:05. |
![]() |
![]() |
Часовой пояс GMT +4, время: 13:38. |
|
|
« Предыдущая тема | Следующая тема » |
|
|