PDA

Просмотр полной версии : Проблема с MouseEvents


makanmel
02.06.2007, 18:33
Есть Canvas с разными контролами (Button, Label, TextArea), который является Tooltip'ом (или Hint'ом) появляющимся при наведении мышки на кнопку.

Нужно, чтобы после наведения (MouseOver), а потом убирания мышки с него (MouseOut) он прятался, а если был клик на нем, то оставался.

Проблема в том, что событие MouseOut возникает при передвижении мышки на другие контролы в пределах Canvas'а (кнопку или текстовое поле), а не только когда мы уберем мышку с самого Canvas'а.


<?xml version="1.0" encoding="utf-8"?>
<RSSTooltipBase
xmlns="controls.*"
xmlns:mx="http://www.adobe.com/2006/mxml"
width="{INITIAL_WIDTH}"
height="{INITIAL_HEIGHT}"
borderStyle="solid"
borderColor="#0000FF"
backgroundColor="#FFFFEE"
cornerRadius="8">
<mx:Label
id="titleLabel"
text="{title}"
textAlign="center"
width="{INITIAL_WIDTH - 20}"
fontSize="12"
fontWeight="bold"
left="0"
top="0"
mouseOut="event.stopPropagation();"/>
<mx:Button
label="x"
width="16"
height="16"
right="2"
top="2"
cornerRadius="8"
click="onCloseClick(event);"
mouseOut="event.stopPropagation();"/>
<mx:TextArea
id="rssField"
htmlText="{description}"
width="{INITIAL_WIDTH - 8}"
height="{INITIAL_HEIGHT - 42}"
bottom="21"
backgroundColor="#FFFFEE"
horizontalCenter="0"
borderStyle="none"
horizontalScrollPolicy="off"
editable="false"
mouseOut="event.stopPropagation();"/>
<mx:TextArea
id="linkLabel"
htmlText="{link}"
textAlign="center"
backgroundColor="#FFFFEE"
color="#000088"
borderStyle="none"
horizontalCenter="0"
width="{INITIAL_WIDTH - 20}"
height="20"
editable="false"
left="0"
bottom="0"
mouseOut="event.stopPropagation();"/>
</RSSTooltipBase>



public function RSSTooltipBase()
{
super();
addEventListener(MouseEvent.MOUSE_OVER, onMouseOver);
}

public function close() : void
{
dispatchEvent(new TooltipWindowEvent(TooltipWindowEvent.CLOSE_TOOLTIP));
}

public function onCloseClick(event : MouseEvent) : void
{
close();
}

public function onMouseOver(event: MouseEvent) : void
{
dispatchEvent(new TooltipWindowEvent(TooltipWindowEvent.STOP_CLOSE_TIMER));
removeEventListener(MouseEvent.MOUSE_OVER, onMouseOver);
addEventListener(MouseEvent.MOUSE_OUT, onMouseOut);
addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
}

public function onMouseDown(event: MouseEvent) : void
{
removeEventListener(MouseEvent.MOUSE_OVER, onMouseOver);
removeEventListener(MouseEvent.MOUSE_OUT, onMouseOut);
}

public function onMouseOut(event: MouseEvent) : void
{
if (event.eventPhase != 3) close();
}


Пришлось пока написать на всех контролах mouseOut="event.stopPropagation();"

и проверку event.eventPhase.

Я знаю что есть какой-то более элегантный способ, но через поиск не могу найти.

MerlinTwi
03.06.2007, 19:47
Вам наверное поможет это:
http://flasher.ru/forum/showpost.php?p=581297&postcount=66
http://flasher.ru/forum/showpost.php?p=581702&postcount=67

makanmel
04.06.2007, 14:05
Вам наверное поможет это:
http://flasher.ru/forum/showpost.php?p=581297&postcount=66
http://flasher.ru/forum/showpost.php?p=581702&postcount=67

Добавил mouseChildren=false для Tooltip'а, теперь все отлично, кроме того, что я не могу нажать кнопку закрытия на Tooltip'е. Пробовал отдельно для этой кнопки устанавливать mouseEnabled=true - ничего не меняется.

Пробовал также забрать mouseChildren=false у Tooltip'а, и для всех контролов кроме кнопки закрытия поставить mouseEnabled=false - тогда возвращаются все глюки какие были раньше.

Dendroid
04.06.2007, 21:09
Добавил mouseChildren=false для Tooltip'а, теперь все отлично, кроме того, что я не могу нажать кнопку закрытия на Tooltip'е. Пробовал отдельно для этой кнопки устанавливать mouseEnabled=true - ничего не меняется.

Пробовал также забрать mouseChildren=false у Tooltip'а, и для всех контролов кроме кнопки закрытия поставить mouseEnabled=false - тогда возвращаются все глюки какие были раньше.
Всё правильно. Эти свойства меняют чувствительность к мыши - не поможет, т.к. чувствительность мыши должна оставиться на всех активных объектах.

Если не хочется заморачиваться со множеством событий, проще всего на Over запускать таймер, который будет проверять наличие объекта под мышкой (через hitTestPoint() например), и прятать его, если мышь ушла. Тут даже можно сделать такую удобную фичу: прятать не сразу, например, а через пару "тиков". Тогда если пользователь вышел за пределы объекта случайно и быстро вернулся - объект не прячется. Так многие виндовые менюшки сделаны. :)

makanmel
04.06.2007, 21:33
Спасибо, попробую.