Другой вариант, если ваша реализация не позволяет вам отключить события мыши для верхнего UIComponent , это вручную перезапустить событие.
Вот довольно общий пример. Присоедините следующий обработчик для MouseEvent.CLICK
к контейнеру, который содержит другие UIComponents или к UIComponent сверху:
private function propagateClickEvent(event:MouseEvent):void
{
// find all objects under the click location
var uicOver:Array = getObjectsUnderPoint(new Point(event.stageX, event.stageY));
// filter out what you don't want; in this case, I'm keeping only UIComponents
uicOver = uicOver.filter(isUIComponent);
// resolve skins to parent components
uicOver = uicOver.map(resolveSkinsToParents);
// remove the current item (otherwise this function will exec twice)
if (event.currentTarget != event.target) { // otherwise let the following line do the removal
uicOver.splice(uicOver.indexOf(event.currentTarget),1);
}
// remove the dispatching item (don't want to click it twice)
uicOver.splice(uicOver.indexOf(event.target),1);
// dispatch a click for everything else
for each (var uic:UIComponent in uicOver) {
uic.dispatchEvent(new MouseEvent(MouseEvent.CLICK, false)); // no bubbling!
}
}
// test if array item is a UIComponent
private function isUIComponent(item:*, index:int, arr:Array):Boolean {
return item is UIComponent;
}
// resolve Skins to parent components
private function resolveSkinsToParents(item:*, index:int, arr:Array):* {
if (item is Skin) {
return item.parent;
}
return item;
}
Этот код будет работать в MXML следующим образом:
<s:Group click="propagateClickEvent(event)">
<s:Button click="trace('button1')"/>
<s:Button click="trace('button2')"/>
<s:Button click="trace('button3')"/>
</s:Group>
<!-- trace output on click: "button3", "button1", "button2" -->
Это очень общее. Я бы порекомендовал использовать что-то более конкретное, чем UIComponent
, в противном случае он, вероятно, отправил бы больше кликов, чем необходимо. Все зависит от того, что вы на самом деле делаете.
Кроме того, пример MXML довольно скудный, поскольку, если бы вы знали все свои компоненты заранее, вы бы наверняка справились с этим по-другому. Однако, если бы у вас было несколько компонентов, позиции которых были определены во время выполнения, такой подход имел бы больше смысла.