Flash AS3: как предотвратить MouseEvent.MOUSE_OUT при наведении указателя мыши на дочерний спрайт - PullRequest
3 голосов
/ 25 сентября 2011

All

Вот моя ситуация ...

Интерфейс моего приложения Flash представляет собой сетку. Каждая строка сетки представляет собой спрайт, который содержит несколько дочерних спрайтов (элементов управления пользовательского интерфейса), которые отвечают на события мыши

Каждая строка сетки должна иметь эффект наведения - то есть, когда вы наводите курсор мыши на строку, фон строки должен изменить цвет.

Это легко сделать:

rowSprite.addEventListener(MouseEvent.MOUSE_OVER, highlightRow, false, 0, true);
rowSprite.addEventListener(MouseEvent.MOUSE_OUT, unhighlightRow, false, 0, true);

Это прекрасно работает, за исключением того, что, когда пользователь переворачивает любой из дочерних спрайтов строки, вызывается событие MOUSE_OUT строки, и строка "невыделена". Это не то, что я хочу.

Другими словами - я бы хотел бы строку, чтобы она не выделялась, только когда вы катите ВНЕ строки, а не когда вы переворачиваете дочерний спрайт внутри строки.

Возможное решение: в функции unhighlightRow проверьте, находится ли позиция мыши пользователя в пределах границ спрайтов строк. Но я предполагаю, что это не самое элегантное или эффективное решение.

Это должно быть невероятно распространенная проблема. Какое лучшее решение?

Заранее спасибо!

Ответы [ 4 ]

7 голосов
/ 26 сентября 2011

Вы можете использовать ROLL_OVER и ROLL_OUT вместо MOUSE_OVER и MOUSE_OUT в таких случаях:

http://kinderas.blogspot.com/2008/12/quicktip-mouseover-vs-rollover.html

2 голосов
/ 26 сентября 2011

Да, это очень распространенная проблема, и Adobe предоставила решение.

Вы можете использовать свойство mouseChildren - установите его на false, чтобы дети не генерировали (да, генерировали) мышьсвязанные события, которые в вашем случае избавят вас от нежелательных mouseOut событий, так как не будет соответствующего события mouseOver, генерируемого, когда ваш курсор входит в дочернюю область.

mouseChildren доступно для DisplayObjectContainer объектов.

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/DisplayObjectContainer.html#mouseChildren

1 голос
/ 27 сентября 2011

Чтобы запретить детям получать набор событий мыши. Это решило бы вашу проблему:

rowSprite.mouseChildren = false;
0 голосов
/ 25 сентября 2011
rowSprite.addEventListener(MouseEvent.MOUSE_OVER, highlightRow, false, 0, true);
rowSprite.addEventListener(MouseEvent.MOUSE_OUT, unhighlightRow, false, 0, true);

function unhighlightRow (e:MouseEvent):void {
   if(Sprite(e.target).contains(e.currentTarget)) {
      return
   }
}

не проверял, но должно работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...