as3 mouseEnabled все еще проблема для меня

Спустя пару лет я все еще кое-что не понимаю в mouseEnabled. У меня есть спрайт (например, здесь «Небо», который содержит много объектов, одно из них - Облако, которое я не хочу получать События мыши. Я накладываю это Небо на некоторые другие экранные объекты. Я хочу, чтобы облако было видимым, но не блокировать события мыши.Если вы видите дерево сквозь облака, вы должны иметь возможность щелкнуть по дереву.

В классе Sky:

mouseEnabled = false;
cloud.mouseEnabled = false;
cloud.mouseChildren = false;

Даже с этой конфигурацией, когда облако находится над деревом, я не могу щелкнуть по дереву, потому что облако блокирует его. Почему???


person phil    schedule 11.02.2010    source источник


Ответы (2)


Несмотря на то, что Sky имеет для mouseEnabled / mouseChildren значение false ... это все еще объект, он по-прежнему занимает место и, следовательно, по-прежнему действует как область попадания для любых контейнеров PARENT, для которых для mouseEnabled / mouseChildren установлено значение false.

Поэтому я подозреваю, что ваш объект Sky не находится в том же родительском контейнере, что и ваш объект Tree. Ваш объект Sky, вероятно, имеет собственный родительский объект-контейнер, который является виновником перехвата событий.

Для уточнения: любой объект, содержащий НИЧЕГО, будет иметь область попадания и будет перехватывать щелчки мыши, даже если для всех отдельных вещей, которые он содержит (формы, дочерние объекты и т. Д.), Для mouseEnabled / mouseChildren может быть установлено значение false.

Таким образом, даже если у вашего объекта Sky для mouseEnabled установлено значение false, ваше Sky (и его дочерние элементы) по-прежнему занимают место и, следовательно, по-прежнему дают родительскому контейнеру Sky область попадания для перехвата событий мыши.

Поэтому ваше решение состоит в том, чтобы убедиться, что для всех родительских контейнеров Sky свойство mouseEnabled установлено в значение false, по крайней мере, до (но не включая) первого контейнера общего предка объектов Tree и Sky.

Кроме того, установив mouseEnabled = false и оставив mouseChildren = true, вы можете получить контейнер, в котором только выбранные дочерние элементы с mouseEnabled = true будут получать события щелчка :)

person Triynko    schedule 21.04.2010
comment
Спасибо, у меня была аналогичная проблема с текстовыми полями, и она была в контейнере, у которого был общий предок кнопки. Без прямой ссылки на контейнер я смог вызвать родителя и установить для mouseEnabled / Children значение false. - person gltovar; 04.10.2012

Вы говорите, что там «много предметов»? Скорее всего, это блокирует что-то еще. Я рекомендую добавить слушателя в сцену, и тогда вы сможете увидеть, какой объект получает клики:

import flash.utils.getQualifiedClassName;
stage.addEventListener(MouseEvent.CLICK, onClick);
private function onClick(event:MouseEvent):void
{
    trace(event.target.name, getQualifiedClassName(event.target));
}

Разместите больше кода, и мы, вероятно, сможем больше помочь.

person typeoneerror    schedule 11.02.2010
comment
хорошо, забудьте про множество объектов. Только один объект, который я хочу отключить, и один, который я хочу включить. Включенный объект очень мал и не влияет на это. Вот что я получаю, когда использую опубликованный вами код: instance5 flash.display :: Sprite - person phil; 12.02.2010
comment
Хорошо, так что там есть спрайт без имени экземпляра, который получает щелчок вместо облака. у вашего дерева есть имя экземпляра? Я бы дал названия вашим клипам, чтобы вы могли понять, какой из них на самом деле блокирует. - person typeoneerror; 12.02.2010