Форум 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=156567)

Universe 24.05.2011 00:55

Прокричать событие "глобально"
 
Возникла бредовая идея от переизбытка лени, но всё таки спрошу, представьте что есть 10 вложенных друг в друга объектов и самый глубокий диспатчит событие, которое должен услышать самый верхний. Как то можно упростить процедуру диспатчинга или обязательно через точку указывать все объекты вглубь при подписывании объекта на слушатель?

Psycho Tiger 24.05.2011 01:03

bubble`ing? :)

Universe 24.05.2011 01:06

а поподробнее?)

stweet 24.05.2011 01:10

да нет, почему же?

Не так давно с этим боролся =)

Есть объект "кнопка", не важно на каком она уровне, важно что она кнопка и она исполняет какое ни будь действие!

Далее, к примеру, привяжем её к интерфейсу "IButton" в котором укажем для всех объектов "кнопка" метод "function onClick(ar:Function):void;".
Код AS3:

 
// объявим методы в классе "кнопка":
 
function onClick(ar:Function):void
{
    ar.call();
}
 
// после, не важно где, можно в классе "майн"
// привязав линснер к стэйджу задавать такой вопрос:
 
function onMouse (e:MouseEvent):void
{
    if (e.target as IButton) IButton (e.target).onClick(outPut);
}
 
// должна ответить
 
function outPut ():void
{
    trace("onClick");
}


Universe 24.05.2011 01:29

так что лисенер в вашем примере надо на stage подписывать или на тот объект в котором эта кнопка где то там находится?

stweet 24.05.2011 01:35

нет, только на стэйдж.

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

// interface *********************************************
 
package
{
 
        /**
        * ...
        * @author estweet
        */

        public interface InButton
        {
                function onClick(ar:Function):void;
        }
 
}
 
// class button ********************************************
 
package
{
        import flash.display.Sprite;
        /**
        * ...
        * @author estweet
        */

        public class MyBytton extends Sprite implements InButton
        {
 
                public function MyBytton()
                {
                        super();
 
                        this.mouseChildren = false;
 
                        var spr:Sprite = new Sprite();
                        spr.graphics.beginFill(0xCCCCCC);
                        spr.graphics.drawRect(0, 0, 50, 30);
                        addChild(spr);
                }
 
                /* INTERFACE tmpImage.InButton */
 
                public function onClick(ar:Function):void
                {
                        ar.call();
                }
        }
}
 
// class main **********************************************
 
package
{
        import flash.display.Sprite;
        import flash.events.MouseEvent;
 
        /**
        * ...
        * @author estweet
        */

        public class TestListener extends Sprite
        {
 
                public function TestListener()
                {
                        super();
 
                        var spr:MyBytton = new MyBytton();
 
                        spr.x = 10;
                        spr.y = 10;
 
                        addChild(spr);
 
                        stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseListener);
                }
 
                private function onMouseListener(e:MouseEvent):void
                {
                        if (e.target as InButton) InButton(e.target).onClick(outPut);
                }
 
                private function outPut ():void
                {
                        trace("onClick!");
                }
        }
}


Psycho Tiger 24.05.2011 01:49

Цитата:

Сообщение от Universe (Сообщение 998207)
а поподробнее?)

В иерархии DisplayList`а это реализовано нативно. Посмотрите второй аргумент у конструктора класса Event.

stweet 24.05.2011 01:55

Цитата:

Сообщение от Universe (Сообщение 998214)
так что лисенер в вашем примере надо на stage подписывать или на тот объект в котором эта кнопка где то там находится?

Вообще по идее, изначально слушатели только на стэйдже приписаны а далее программисты их перенаправляют, в данном примере более удобный подход к лиснерам. Мне по затылку однажды надавали за то что я лиснеры пихал во все возможные места теперь для любого приложения мне хватает 2-3 штуки на стэйдже.

DZHETIGAPA 24.05.2011 03:08

Цитата:

Сообщение от Psycho Tiger (Сообщение 998218)
В иерархии DisplayList`а это реализовано нативно. Посмотрите второй аргумент у конструктора класса Event.

Психо Тигр, допустим я продиспатчил событие в самом глубоком объекте
Код AS3:

dispatchEvent(new Event(Event.CHANGE, true));

А затем в главном родительском объекте просто подписываюсь на это событие? так выходит?

Dukobpa3 24.05.2011 03:39

это событие всплывает дальше по дисплейЛисту Пока в каком-то листенере не пропишешь event.stopPropagation();

Чтоб его услышать выше надо подписаться на какой-то из родителей того кто диспатчил. например:

окна, а окне панель, в панели кнопка, которая диспатчит.

панель подписывается на кнопку.
окно подписывается на панель
а мейн подписывается на окно.

и все они получают одно и то же событие.


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

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