|
|
|||||
Отловить клик по контейнеру
Ситуация такая, есть некий контейнер (в действительности их много похожих), в который динамически помещаются различные DisplayObject-ы, например, Bitmap в не известном количестве. На одном глобальном контейнере (пусть для простоты это будет stage) стоит слушатель клика мыши. Как определить, что клик произошел именно по тому контейнеру, о котором упоминалось в самом начале (куда подгружаются объекты)? Один способ знаю, но его "кривость" зашкаливает, поэтому прошу помощи. Заранее спасибо.
__________________
Ну все, теперь Забава м-о-я. Гы-гы, а корабль мой! |
|
|||||
[+4 06.05.14]
|
Я так понял есть два контейнера один поверх другого? Допустим на один и второй повешано событие клика, при этом стоит указать что на том контейнере что сверху mouseChildren = true, а вот на том что снизу сделать прозрачный бекграунд.
|
|
|||||
А если в глобальном контейнере проверять того, кто вызвал событие?
|
|
|||||
stage.addEventListener(MouseEvent.CLICK, onGlobalContainerClick, false, 0, true); .... private function onGlobalContainerClick(e:MouseEvent):void { trace(e.target); trace(e.currentTarget); } а клацнули мы примерно по stage.Sprite.Sprite.Sprite.Bitmap (все, естественно, условно). Там вот, отловить нужно объект, выделенный в цепочке красным. Известно, что он является экземпляром класса MyClass, наследованным от Sprite. И при этом глубина нахождения различных элементов не известна, т.е. изменчива, в зависимости от места клика. Когда я в начале поста писал про кривой способ, это имелся в виду набор конструкций типа if(parent is MyClass)... if(parent.parent is MyClass)... и т.д.
__________________
Ну все, теперь Забава м-о-я. Гы-гы, а корабль мой! |
|
|||||
Наверняка этот Sprite (в дальнейшем "кнопка") создал ты и он не является продуктом сторонней библиотеки.
Поэтому: 1. Перехвати клик в коде, который точно знает что это за кнопка (Окно, содержащее эту кнопку или рендерер, содержащий кнопку, или это сама кнопка). 2. Как перехватишь, отправь кастромное событие "mySpriteClick" (с bubbling-фазой, конечно) 3. Поймай событие "mySpriteClick" и по event.target определи, что это была за кнопка. Можно (чаще нужно) в кастомном событии сделать типизированное поле mySprite:Sprite и устанавливать его при отправке и читать при приеме Если нет контейнера, который знает кнопку и может послать событие - создай, положи туда кнопку и добавляй этот контейнер везде вместо самой кнопки. Это вполне оправдано. |
|
|||||
Цитата:
Цитата:
__________________
Ну все, теперь Забава м-о-я. Гы-гы, а корабль мой! |
|
|||||
хотелось бы избежать слушателя в каждом подобном экземпляре (а их может быть не одна сотня) Или имеется ввиду потеря времени на подписку? Скорость не проверял, но: есть такой метод willTrigger, им можно проверить, слушает ли кто-нибудь это всплывающее событие вверх по списку. И не создавать его без надобности в "контейнерах-ретрансляторах" |
Часовой пояс GMT +4, время: 09:36. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|