Просмотр полной версии : Организовать грамотный код
DZHETIGAPA
14.01.2011, 00:59
Возникла проблемка, как грамотно организовать работу кода. Вот простейший код, который помещен в прослушиватель события ENTER_FRAME:
private function onFrame(e:Event):void
{
if (rectSpr.height > stage.stageHeight / 2) addChild(_scrollBar);
if (rectSpr.height < stage.stageHeight / 2) removeChild(_scrollBar);
}
Но тут при каждом кадре на сцену добавляется _scrollBar и соответственно тормоза. Мне же надо, что бы addChild(_scrollBar) срабатывало один раз при выполнении условия оператора. Аналогично и с removeChild(_scrollBar). То есть, если выполнилось условие, то addChild(_scrollBar), но только один раз. Когда выполняется следующее условие, то removeChild(_scrollBar) и тоже один раз.
А то у меня как-то все громоздко получается и некрасиво. Или же тут нужно собственные события создавать?
Ну вообще-то бы надо на кастомное событие производить действие, то есть надо слушать тот объект, который может изменить 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);
}
}
ну или так:
private function onFrame(e:Event):void{
if (rectSpr.height > stage.stageHeight / 2 && !_scrollBar.parent) {
addChild(_scrollBar);
}
if (rectSpr.height < stage.stageHeight / 2 && _scrollBar.parent) {
removeChild(_scrollBar);
}
}
Короче говоря дофига вариантов, но EnterFrame явно не лучший.
DZHETIGAPA
14.01.2011, 01:18
Ну вообще-то бы надо на кастомное событие производить действие, то есть надо
Короче говоря дофига вариантов, но EnterFrame явно не лучший.
Можешь мне пжлст написать хоть парочку вариантов или дать ссылки для наводки. Просто я еще не спец во флэше, а вот развиваться надо. ENTER_FRAME первое, что мне зеленому пришло в голову:)
Колин Мук "Action Script 3.0 для Flash. Подробное руководство."
DZHETIGAPA
14.01.2011, 01:23
Уже несколько раз перечитываю. Он даже щас открыт у меня на главе Пользовательские события:)
Кхм, давай рассуждать.Пока без всяких паттернов и проч.
Что у тебя может менять высоту rectSpr?
Как вариант (не самый лучший, но все же):
1)создаешь свой класс наследник от Sprite и экземпляр этого класса и будет rectSpr
2)переопределяешь там heigth - override public function set height(value:Number){super.height=value;dispatchEvent(new Event('RESIZE'))}
3)подписываешься на Event('RESIZE')
4)добавляешь или удаляешь _scrollBar
DZHETIGAPA
14.01.2011, 01:29
rectSpr - тут у меня находится различный контент(height у всех разный), который изменяет свои размеры при наведении на него. Если height вылазит за пределы сцены, то появляется скроллер.
Правильно ли я понимаю, что в этом классе sprRect я должен диспетчеризировать свое событие?
Ну к примеру:
Класс 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);
}
}
}
Класс ResizeSprite.as
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));
}
}
}
Что мы получили - теперь мы можем подписываться на событие RESIZE у любого экземпляра класса ResizeSprite и узнавать, когда меняются его размеры.
Но когда пишут скроллы, то обычно учитывается, что они будут работать с любым видим контентом, то есть сам скролл должен приспосабливаться под контент, а не наоборот.
DZHETIGAPA
14.01.2011, 01:53
Понял зачем событие resizeSpr.addEventListener(ResizeSprite.RESIZE, _resizeHandler) только когда скомпилировал. То есть тут экземпляру класса присваивается новое значение высоты и ширины. И не надо ЭнтерФрэйм использовать.
Ладно... буду разбираться в своей огороде...
То есть тут экземпляру класса присваивается новое значение высоты и ширины
Ничего там не присваивается, resizeSpr.addEventListener(ResizeSprite.RESIZE, _resizeHandler) - это мы просто подписываемся, чтобы слушать когда изменится высота или ширина resizeSpr.Я же описал выше логику происходящего.
Еще раз, зачем я сделал класс 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.
DZHETIGAPA
14.01.2011, 01:56
Спасибо за помощь:)
JackFromChaos
14.01.2011, 16:41
Ну к примеру:
...
Что мы получили - теперь мы можем подписываться на событие RESIZE у любого экземпляра класса ResizeSprite и узнавать, когда меняются его размеры.
Но когда пишут скроллы, то обычно учитывается, что они будут работать с любым видим контентом, то есть сам скролл должен приспосабливаться под контент, а не наоборот.
А что будет, если внутри ResizeSprite кто-то изменит свою позицию, таким образом изменив размеры ResizeSprite без явного присвоения width и height? :rolleyes:
А что будет, если внутри ResizeSprite кто-то изменит свою позицию, таким образом изменив размеры ResizeSprite без явного присвоения width и height?
Поэтому-то универсальные скроллы из компонентов флеша и флекса, основаны на таймерах.
Здесь же задача стояла немного по другому и я к тому же написал, что этот пример является именно примером, для изучения пользовательских событий.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.