点击即可点击下方

时间:2011-10-10 16:34:36

标签: actionscript-3 air

我有一个可视化位于网格顶部的UIComponent,它也是一个UIComponent。位于顶部的网格和UIComponent位于不同的分支上。网格上有精灵的孩子。调度MousEvent.CLICK后,它将转到顶部的UIComponent。我想要它做的是去下面的网格元素。这可能吗?

3 个答案:

答案 0 :(得分:1)

是的,你可以,

如果您的元素ID是“ui_component”

然后在ActionScript中你应该添加两个属性

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

这将告诉您的组件在其后面的M​​ovieClip上传递click事件。

我希望这会有所帮助。

答案 1 :(得分:1)

我必须做的只是将UIComponent置于最顶层top.mousEnabled = false

答案 2 :(得分:1)

如果您的实施不允许disable the mouse events for the top UIComponent,则另一个选项是手动重新发送事件。

这是一个相当通用的例子。将MouseEvent.CLICK的以下处理程序附加到容纳其他UIComponent的容器或顶部的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示例相当差,因为如果您事先知道所有组件,那么您肯定可以采用不同的方式处理它。但是,如果你有一堆组件的位置是在运行时确定的,那么这种方法会更有意义。