Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   FAQ (http://www.flasher.ru/forum/forumdisplay.php?f=86)
-   -   [as3] Передача параметров обработчику события (http://www.flasher.ru/forum/showthread.php?t=80015)

Nirth 20.05.2006 10:07

[as3] Передача параметров обработчику события
 
Перед прочтением советуется ознакомиться с топиком [as3] Создание и рассылка своих собственных событий

Бывают случаи когда обработчику события нужно передать определенные параметры, разберем абстрактный случай, например у нас есть класс наслейдующий от Sprite, класс рассылает специально событие changed, которое рассылается при изменении размера, позиции или добавлении дочерних DisplayObject'ов.
Для этого мы создадим собственное событие ( класс наслейдующий flash.events.Event ) с возможностью записи "типа изменения".

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

package com.onorange.faq.events {
    import flash.events.Event;
   
    public class ChangeEvent extends Event{
        private var __changeType:String;
        //создамим константу, содержащую в себе названия события.
        public static const CHANGED:String = "changed";
       
        //Создаем константы содержащие в себе типы изменения
        public static const POSITION:String = "position";
        public static const SIZE:String = "size";
        public static const CHILD:String = "child";
       
        //создаем конструктор
        public function ChangeEvent(type:String,changeType:String) {
            super(type);
            __changeType = changeType;
        }
        //создаем метод акксесор
                public function get changeType():String {
            return __changeType;
                }
    }
}

Теперь создадим класс который будет рассылать данные события
Код:

package com.onorange.faq.display {
        import com.onorange.faq.events.ChangeEvent;
        import flash.display.Sprite;
        import flash.display.DisplayObject;
   
        public class ChangeDispatcher extends Sprite{
         
                public function ChangeDispatcher() {
                        super();
                        //больше нам ничего от конструктора не надо
                }
       
                //переопределяем методы addChild
                public override function addChild(child:DisplayObject):DisplayObject {
                        //рассылаем наше событие, при создании события задаем дополнительный параметр
                        dispatchEvent(new ChangeEvent(ChangeEvent.CHANGED,ChangeEvent.CHILD));
             
                        return super.addChild(child);             
                }         
         
        //методы для изменения размера и позиции
         
                public function setSize(width:Number,height:Number):void {
                      this.width = width;
                      this.height = height;
                      dispatchEvent(new ChangeEvent(ChangeEvent.CHANGED,ChangeEvent.SIZE));
                }
               
                public function setPosition(x:Number,y:Number):void {
                        this.x = x;
                        this.y = y;
                        dispatchEvent(new ChangeEvent(ChangeEvent.CHANGED,ChangeEvent.POSITION));
                }
    }
}

Ну и собственно проверяем
Код:

package {
        import com.onorange.faq.display.ChangeDispatcher;
        import com.onorange.faq.events.ChangeEvent;
        import flash.display.Sprite;
        public class Test extends Sprite {
                public function Test() {
                        var cd:ChangeDispatcher = new ChangeDispatcher();
                        //подписываем обработчик
                        cd.addEventListener(ChangeEvent.CHANGED,__handleEvent);
                        //вызываем наши методы для проверки
                        cd.setPosition(20,20);
                        cd.setSize(50,50);
                        cd.addChild(new Sprite());                       
                }
                //со[даем обработчик
                private function __handleEvent(evt:ChangeEvent):void {
                        trace(evt.changeType);
                }
        }
}



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

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