![]() |
Двойное событие
Всем доброго вечера!
У меня есть базовый класс RenderWindow от которого наследуется любое GUI. Собственно поведение RenderWindow устроено так, что он обрабатывает события мыши и посылает события с типом произошедшего события мыши. Собственно вот как это устроено: Код AS3:
И вот я от RenderWindow наследую два класса: 1. GUIMainMenu 2. GUIMenuButton GUIMenuButton я прикрепляю к GUIMainMenu в контейнер его. И вот в чём ошибка: когда я тыкаю мышкой на GUIMenuButton, у меня вызывается два события: 1. Событие GUIMenuButton 2. Событие GUIMainMenu Почему так? Ведь GUIMenuButton лежит в GUIMainMenu и перекрывает его. Тогда почему два события происходят? |
Обычное всплытие События. Вы считаете, что можете кликнуть по содержимому контейнера, не кликнув при этом по самому контейнеру?
|
Потому, видимо, что меню также рассылает событие получателем которого является кнопка, в фазе "захвата". Различить их можно по свойствам currentTarget, и eventPhase.
А в чем удобство вашего такого подхода? Зачем так вообще сделано? |
Wolsh
Цитата:
fish_r Цитата:
Цитата:
Собственно сейчас я пытаюсь сделать главное меню. Нажимаю на кнопку и появляется контекстное меню. А когда я тыкаю в любое другое RenderWindow (то есть имя полученного в событие RenderWindow не совпадёт с именем RenderWindow меню), то я закрываю текущее контекстное меню. То есть есть меню GUIMainMenu, которое полоской простирается во всю ширину экрана. На этой полоске в самом начале (0,0) располагается кнопка меню GUIMenuButton. Как я нажимаю на кнопку, я открываю прикрёплённое за кнопкой GUIContextMenu, а как у меня происходит нажатие на любой другой RenderWindow, то я скрываю контекстное меню (правда оно не скрывается если тыкнули на кнопку, которая наоборот открывает это контекстное меню). Так вот, по сути если открыто контекстное меню и мы тыкнули на главное меню в его любой части, но там где нет кнопки открытия этого контекстного меню, мы должны закрыть меню. Так и происходит. Но когда я тыкаю на кнопку открытия этого меню, у меня приходят два события: 1. Событие GUIMenuButton - контекстное меню открывается 2. Событие GUIMainMenu - контекстное меню закрывается В результате я никогда не увижу это контекстное меню. Вот зачем оно два события посылает и как это исправить? |
Вот в том то и дело, что Меню рассылает событие получателем которого является Кнопка, в первой фазе event flow. А ваша конструкция не имеет инструментов различения фазы и принадлежности события, поэтому и "захватывает" всё подряд. Почитайте документацию о реализации событий в среде флеш.
По поводу вашего минифреймворка. Может я не правильно, или не до конца понял вашу мысль, но кажется, всё, каким-то... сложным. Я бы например делал бы так: Код AS3:
|
fish_r
Цитата:
|
Вы не правильно понимаете модель распространения событий ( отображаемых объектов), поэтому и говорю, что вам нужно бы ознакомиться с ней, тогда всё станет яснее...
Меню не рассылает кнопке. Меню просто диспатчит событие двигающееся от стейджа к Кнопке. Ваша конструкция обрабатывает это событие так, как будет его получателем является Меню, а на деле это не так. Отсюда и путаница. В общем случае обрабатывается это так: Код AS3:
То есть я вас сейчас ещё больше запутаю :) Второй вариант точнее сформулировать так: получено ли событие в фазе обработки получателем (если это одна из других двух фаз, захвата или всплытия - выходим без обработки). |
fish_r
Можете дать ссылку на статью, где понятным языком рассказано про события? Просто то что Вы написали, я не совсем понял. |
Я, вообще, об этом ещё у Мука читал. Там довольно ясно описано. Ну вот есть в документации: http://help.adobe.com/ru_RU/as3/dev/...0204-7dfb.html. Ещё по форуму посмотрите, этот вопрос, конечно не однократно поднимался здесь.
|
fish_r
Спасибо, завтра почитаю. Если будут вопросы, я сюда напишу. |
Цитата:
Цитата:
Как иначе-то? Совершенно естественное поведение. Кнопка находится внутри меню. Курсор над кнопкой значит что прежде всего он над меню, а потом уже над кнопкой. То есть между курсором и кнопкой "пакетик" меню, в котором лежит эта кнопка. И сначала Вы давите на "пакет", а потом уже "давление" достигает кнопки. Это фаза захвата – когда событие опускается от самого верхнего уровня до самого глубокого объекта под мышью (из списка чувствительных к мыши, естественно). Этот последний, самый глубокий объект, называется target. От него начинается фаза Всплытия (если распространение события не остановлено в обработчике, например методом Event#stopPropagation() ). Поскольку, нажимая на этот объект, Вы естественно нажали на все пакетики, в которые он упакован, каждый из его контейнеров до stage включительно пошлет событие "от себя". Раз Вы на него подписались, то естественно получите. Вы же нажали на Меню, как оно может не посылать событие? Одно из простых "механических" решений состоит в том, что Меню ловит клик не по "всему себе", а только по фоновому для кнопок элементу. То есть фон как бы "кнопка" самого меню, а кнопки меню перекрывают его. Иначе делайте программно, либо с фазами, либо с остановкой распространения. |
Всем доброго вечера!
Прочитал я про события. Довольно всё печально для меня. Так как же мне тогда стоит поступить, чтобы моё меню закрывалось на любое полученное WindowAppEvent кроме пунктов этого меню и кнопки вызова этого меню, когда мне следом после нажатия на кнопку вызова меню идёт событие полоски меню, которое тут же меню и закрывает? Я пока не придумал решения. Как сделать? Добавлено через 1 час 41 минуту Возился, возился...и похоже ничего лучшего не придумал, чем не добавлять кнопки всплывания контекстного меню в главное меню через addChild(), а сделать их параллельными (просто слой главного меню будет с меньшим индексом в списке отображения их общего контейнера). |
Цитата:
|
| Часовой пояс GMT +4, время: 20:09. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.