Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Отследить изменение размера объкта (http://www.flasher.ru/forum/showthread.php?t=128249)

TanaTiX 03.08.2009 15:00

Отследить изменение размера объкта
 
Как отследить изменение размера объекта, создаваемого с размерами, реагирующими на изменение размера сцены. Просмотрел класс Event, погуглил, но то ли пропустил, то ли не нашел. Заранее спасибо.

Dimax4d 03.08.2009 15:22

Event.RESIZE?

TanaTiX 03.08.2009 15:23

Dimax4d, пробовал, никакой реакции...

Dimax4d 03.08.2009 15:24

Я его на stage вешал, с ней работает

TanaTiX 03.08.2009 15:27

Dimax4d, на stage-е и у меня работает, как-никак объект-то резиновый... А вот как в отношении обычного объекта...
Да и вообще. Можно ли как-то отследить изменение значения какой-либо переменной?

Dimax4d 03.08.2009 15:30

может вам тогда переопределить геттер и сеттер на свойства width и height так, чтобы они генерировали событие при изменении?
сам не пробовал, но вдруг...

TanaTiX 03.08.2009 15:32

Dimax4d, а можно подробней? Примерчик элементарный или ссылку?

Dimax4d 03.08.2009 15:32

Сейчас попробую сам закодить, о результатах отпишусь

wvxvw 03.08.2009 15:41

Флешевые дисплей-объекты не диспатчат никаких событий когда вы меняете им размеры, для того, чтобы такие события получать, вам нужно будет отнаследоваться от какого-нибудь наследника DisplayObject и переписать ему свойства width, height, scaleX, scaleY, scrollRect. К сожалению, если вы поменяете размеры через DisplayObject#transform.matrix или используя API для рисования, то отследить изменения размеров вам не удасться.

Dimax4d 03.08.2009 15:46

Код AS3:

package {
        import flash.display.Sprite;
        import flash.events.Event;
 
        public class MySprite extends Sprite
        {
                public function MySprite()
                {
                        super();       
                }
 
                override public function set width(value:Number):void {
                        super.dispatchEvent(new Event(Event.RESIZE));
                        super.width = value;
                }       
        }
}

Но это работает только при прямом изменении ширины. Если меняется размер родителя, то ничего не происходит

TanaTiX 03.08.2009 23:43

Dimax4d, честно говоря немного не догоняю. Предлагаю абстрактный пример: при изменении значения некоторой переменной вне функции, изменяющей соответствующую переменную, вызвать другую функцию
Код AS3:

package {
        import flash.display.Sprite;
        import flash.events.MouseEvent;
        public class Test extends Sprite {
                var t:Number=5;
                var rect:Sprite = new Sprite();
                public function Test():void {
                        rect.graphics.beginFill(0xff0000);
                        rect.graphics.drawRect(10,10,50,30);
                        addChild(rect);
                        rect.addEventListener(MouseEvent.CLICK, onMouse);
                }
                function onMouse(e:MouseEvent):void {//некоторое событие, изменяющее значение переменной, сложность в том, что в этой функции не должно быть никаких указаний на функцию tt();
                        trace("click "+t);
                        t=12;
                        trace("click "+t);
                }
                function tt():void {
                        trace("Change parameter");//эта функция должна запускаться при изменении значения переменной
                }
        }
}


Dimax4d 04.08.2009 00:04

С классом Number пример неудачный. Он определен как final, то есть от него нельзя наследоваться, да и смысла в этом нет. А по сути - почитайте что такое методы get и set для начала, и про систему событий. Тогда мой пример станет вам понятен

Добавлено через 4 минуты
Код AS3:

package {
        import flash.display.Sprite;
        import flash.events.Event;
 
        public class Main extends Sprite
        {
                private var sprite:MySprite = new MySprite();
 
                public function Main()
                {
                        super();       
 
                        sprite.addEventListener(Event.RESIZE, this.resizeHandler);
                        sprite.width = 300; // в этом месте происходит диспетчеризация события Event.RESIZE, как описано в классе MySprite
 
                }
 
                private function resizeHandler(event:Event):void {
                        trace ("Resize");
                }
        }
}


TanaTiX 04.08.2009 01:06

1046: Type was not found or was not a compile-time constant: MySprite.
1180: Call to a possibly undefined method MySprite.
1180: Call to a possibly undefined method MySprite.
Почитал. Как я понял - это обычные свойства того или иного объекта. Читал Мука, там не нашел что б при изменении того или иного значения вызывалась какая-либо функция. get просто получает значение, set задает.

Dimax4d 04.08.2009 01:42

Вложений: 1
Type not found потому что вам надо в ту же папку поместить файл из предыдущего моего примера, тогда скомпилится.

Цитата:

Читал Мука, там не нашел что б при изменении того или иного значения вызывалась какая-либо функция. get просто получает значение, set задает.
По сути да, но в get и set вы можете добавить свои инструкции если захотите. Прмер, показывающий, что это работает - прикреплен.

Герыч 04.08.2009 02:08

Класс с твоей переменной:
Код AS3:

package gerich.propertyevent.example
{       
        import flash.events.Event;
        import flash.events.EventDispatcher;
        import flash.events.IEventDispatcher;
        //Класс содержащий отслеживаемую переменную
        public class VariableWatcher implements IEventDispatcher
        {
                private var _variable:SomeType=DEFAULT_VALUE;
                private var eventDispatcher:EventDispatcher;
                // ========================================================== //
                public function VariableWatcher():void
                {
                        eventDispatcher = new EventDispatcher(this);
                }
                // ========================================================== //
                //Получить значение переменной
                public function get variable():SomeType
                {
                        return _variable;
                }
                // ========================================================== //
                //Изменить значение переменной, при этом оповестить, кто подписался
                public function set variable(_variable:SomeType):void
                {
                        eventDispatcher.dispatchEvent(new VariableWatcherEvent(VariableWatcherEvent.CHANGED,this,_variable));
                        this._variable=_variable;
                }
                // ========================================================== //
                //Дальше реализация интерфейса IEventDispatcher
                // ========================================================== //
                public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
                {
                        eventDispatcher.addEventListener.apply(null, arguments);
                }
                // ========================================================== //
                public function dispatchEvent(event:Event):Boolean
                {
                        return eventDispatcher.dispatchEvent.apply(null, arguments);
                }
                // ========================================================== //
                public function hasEventListener(type:String):Boolean
                {
                        return eventDispatcher.hasEventListener.apply(null, arguments);
                }
                // ========================================================== //
                public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void
                {
                        eventDispatcher.removeEventListener.apply(null, arguments);
                }
                // ========================================================== //
                public function willTrigger(type:String):Boolean
                {
                        return eventDispatcher.willTrigger.apply(null, arguments);
                }
                // ========================================================== //
        }
}

Класс события:

Код AS3:

package gerich.propertyevent.example
{
        import flash.events.Event;
        //Событие изменения переменной
        public class VariableWatcherEvent extends Event
        {
                public static const CHANGED:String = "changed";                //Переменная изменена
                private var _watcher:VariableWatcher;
                private var _newValue:SomeType;                                                //Новое значение переменной
                // ========================================================== //
                public function VariableWatcherEvent(type:String,_watcher:VariableWatcher,newValue:SomeType):void
                {
                        _watcher=watcher;
                        _newValue=newValue;
                }
                // ========================================================== //
                public override function toString():String
                {
                        return formatToString("VariableWatcherEvent");
                }
                // ========================================================== //
                public function get newValue():SomeType
                {
                        return _newValue;
                }
                // ========================================================== //
                public function get oldValue():SomeType
                {
                        return _watcher.variable;
                }
                // ========================================================== //
                public function get watcher():VariableWatcher
                {
                        return _watcher;
                }
                // ========================================================== //
        }
}

Пример использования:

Код AS3:

package gerich.propertyevent.example
{
        //Пример
        public class VariableWatcherExample
        {
                // ========================================================== //
                public function variableWatcherListener(event:VariableWatcherEvent):void
                {
                        trace("Variable changed")
                        trace("-oldValue:",event.oldValue);
                        trace("-newValue:",event.newValue);
                }
                // ========================================================== //
                public function test():void
                {
                        var vw:VariableWatcher=new VariableWatcher();
                        vw.addEventListener(VariableWatcherEvent.CHANGED,variableWatcherListener);
                        vw.variable=SOME_VALUE;
                }
                // ========================================================== //
        }
}



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

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