среда, июня 18, 2008

Как получать сообщения от внедряемых/подгружаемых SWF. AS3

Например, есть у нас заставочка, которую мы подгружаем/внедряем в Flex-приложение.
Она долго проигрывается, и после ее завершения, мы хотим перейти, к примеру, на другой стейт. Но как поймать момент окончания заставки? А если нам надо как-то среагировать на ее команды в процессе воспроизведения? На ум приходит единственный вразумительный способ - генерировать события из заставки.
В простом случае, делается это всего одной строчкой:
this.dispatchEvent(new Event("Done"));
Но как, и кому подписываться на прослушивание этого события?
Да очень просто. В скрипте инициализации Flex-приложения вписываем:
this.addEventListener("Done", this.doneHandler, true);

Постараюсь пояснить происходящее:
При параметре useCapture, установленном в true, мы будем ловить наше событие на фазе захвата. На этой фазе, событие пройдет через всю цепочку дисплей-объектов, в которой сидит наш клип, до самого Stage.
Если мы не установим useCapture в true, то событие не будет обработано, т.к. событие, генерируемое из контейнера не имеет фазы target, а фаза bubbling отсутствует, т.к. мы генерируем событие с параметром по умолчанию bubbles=false.
Можно сделать наоборот - ловить событие на фазе bubbling. Тогда, при генерации события указываем bubbles=false, и получаем:
this.dispatchEvent(new Event("Done", true));
и
this.addEventListener("Done", this.doneHandler);

В процессе выяснений обстоятельств, я наткнулся на статейку: "Reader Question: Why isn’t event bubbling working" где хорошо разъясняется аналогичная ситуация.

Комментариев нет: