我有一个可视化位于网格顶部的UIComponent,它也是一个UIComponent。位于顶部的网格和UIComponent位于不同的分支上。网格上有精灵的孩子。调度MousEvent.CLICK后,它将转到顶部的UIComponent。我想要它做的是去下面的网格元素。这可能吗?
答案 0 :(得分:1)
是的,你可以,
如果您的元素ID是“ui_component”
然后在ActionScript中你应该添加两个属性
ui_component.mouseEnabled = true;
ui_component.mouseChildren = true;
这将告诉您的组件在其后面的MovieClip上传递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示例相当差,因为如果您事先知道所有组件,那么您肯定可以采用不同的方式处理它。但是,如果你有一堆组件的位置是在运行时确定的,那么这种方法会更有意义。