обработка событий as3 - PullRequest
       10

обработка событий as3

1 голос
/ 06 декабря 2010

У меня странная проблема с обработкой событий в AS3.

У меня есть два класса:

public class Configurator extends Sprite {

    public function Configurator () {
        this.addEventListener(FramedPhoto.FRAMED_PHOTO_LOADED, this._test);
        var fp = new FramedPhoto();
    }

    protected function _test(event:Event) {
        trace('_test()');
    }
}

и второй:

public class FramedPhoto extends Sprite {

    public static const FRAMED_PHOTO_LOADED = 'framedPhotoLoaded';

    public function FramedPhoto () {
        trace('FramedPhoto()');
        this.dispatchEvent(new Event(FramedPhoto.FRAMED_PHOTO_LOADED, true, false));
    }
}

Проблема в том, что _test () не запускается.Есть идеи, что можно сделать здесь не так?

Тестовый пакет с исходными файлами доступен по адресу http://blackbox.home.pl/test.zip

Ответы [ 2 ]

1 голос
/ 06 декабря 2010

грейпфрукт ударил ногтем по голове, но если быть более точным, его называют потоком событий. Проще говоря, существует 3 фазы, когда dispatchEvent () вызывается из экранного объекта в списке отображения, это фаза захвата, целевая фаза и пузырьковая фаза. На этапе захвата флэш-плеер перемещается вниз по списку отображения со сцены к экранному объекту, который вызвал dispatchEvent (). Затем во время целевой фазы целевой экранный объект отправляет событие. Затем в фазе пузырьков событие всплывает до стадии.

В вашем случае, если вы хотите, чтобы ваш экранный объект Configurator слышал событие, отправленное из вашего экранного объекта FramedPhoto, вам нужно добавить FramedPhoto в его список отображения.

Я позволил себе добавить класс документа в ваш проект, так как вы все равно должны избегать использования временной шкалы.

package
{
    import com.Configurator;
    import flash.display.MovieClip;

    public class Main extends MovieClip
    {
        public function Main():void
        {
            init();

        }// end function

        private function init():void
        {
            var configurator:Configurator = new Configurator();
            addChild(configurator);

        }// end function

    }// end class

}// end package

Я импортировал ваш класс Configurator (переименовал пакет из abc в com), объявил, создал его и добавил в список отображения.

package com
{
    import com.FramedPhoto;
    import flash.display.Sprite;
    import flash.events.Event;

    public class Configurator extends Sprite 
    {
        public function Configurator():void 
        {
            var framedPhoto:FramedPhoto = new FramedPhoto();
            addChild(framedPhoto);

            framedPhoto.addEventListener(FramedPhoto.FRAMED_PHOTO_LOADED, framedPhotoLoadedHandler);

        }// end function

        public function framedPhotoLoadedHandler(e:Event):void
        {
            trace("framePhotoLoadedHandler()");

        }// end function

    }// end function

}// end function

Затем в вашем классе Configurator я импортировал ваш класс FramedPhoto, объявил и создал его экземпляр. Затем я добавил к нему прослушиватель событий, который прослушивает событие, отправляемое из экранного объекта framePhoto, и вызывает framedPhotoLoadedHandler ().

package com 
{ 
    import flash.display.Sprite;
    import flash.events.Event;

    public class FramedPhoto extends Sprite 
    {
        public static const FRAMED_PHOTO_LOADED = 'framedPhotoLoaded';

        public function FramedPhoto():void
        {
            addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);

        }// end function

        private function addedToStageHandler(e:Event):void
        {
            dispatchEvent(new Event(FRAMED_PHOTO_LOADED, true));

        }// end function

    }// end function

}// end function

Наконец, в классе FramePhoto я добавил прослушиватель событий, который прослушивает, когда экранный объект FramePhoto добавляется на сцену. Когда он добавлен на сцену, он вызовет addToStageHandler (), который отправит событие и будет перехвачен в родительском экранном объекте Configurator.

Надеюсь, это помогло:)

1 голос
/ 06 декабря 2010

События отправляются иерархическим образом, поэтому просто прослушивание события, где бы оно ни было, не поможет. Что вам нужно сделать, это заставить ваш конфигуратор прослушивать объект, который отправляет событие, или один выше его в списке отображения. Если вы хотите перехватить все события, вам нужно прослушать самый верхний объект из всех, stage.

...