Нажмите, чтобы ударить внизу - PullRequest
1 голос
/ 10 октября 2011

У меня есть UIComponent, который визуально расположен поверх сетки, который также является UIComponent.Сетка и UIComponent, который находится сверху, находятся на разных ветвях.У этой птицы есть дети, которые являются спрайтами.Когда MousEvent.CLICK отправляется, он переходит к UIComponent сверху.То, что я хочу, это сделать элемент сетки внизу.Это возможно?

Ответы [ 3 ]

1 голос
/ 10 октября 2011

Что мне нужно было сделать, так это просто сделать UIComponent сверху top.mousEnabled = false

1 голос
/ 11 октября 2011

Другой вариант, если ваша реализация не позволяет вам отключить события мыши для верхнего 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 довольно скудный, поскольку, если бы вы знали все свои компоненты заранее, вы бы наверняка справились с этим по-другому. Однако, если бы у вас было несколько компонентов, позиции которых были определены во время выполнения, такой подход имел бы больше смысла.

1 голос
/ 10 октября 2011

Да, можно,

если идентификатор вашего элемента равен "ui_component"

тогда в ActionScript вы должны добавить два свойства

ui_component.mouseEnabled = true;
ui_component.mouseChildren = true;

Это скажет вашему компоненту передать событие щелчка на MovieClip позади него.

Надеюсь, это поможет.

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