as3 mouseEnabled все еще проблема для меня - PullRequest
10 голосов
/ 12 февраля 2010

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

В небесах класс:

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

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

Ответы [ 2 ]

28 голосов
/ 22 апреля 2010

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

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

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

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

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

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

4 голосов
/ 12 февраля 2010

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

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

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

...