AS3 - MovieClip内的按钮触发MC的事件

时间:2012-09-09 10:29:37

标签: actionscript-3 button mouseevent movieclip

在舞台上,我有一个名为“mc”的MovieClip,里面画了一个简单的矩形。 mc还有一个名为“btn”的Button子,这是另一个简单的矩形(显然小于mc的矩形)。然后我在舞台上有这个代码。

function mcDown( _e:MouseEvent):void{
    trace( "mc" );
}
function btnClick( _e:MouseEvent):void{
    trace( "btn" );
}
mc.addEventListener( MouseEvent.MOUSE_DOWN, mcDown );
mc.btn.addEventListener( MouseEvent.CLICK, btnClick );

我遇到的问题是当点击按钮时,mcDown事件也会被触发并跟踪“mc”和“btn”。

我怎样才能这样做,当我点击按钮时,它只触发btnClick而不是mcDown?我试过MOUSE_UP而不是CLICK,同样的问题。并且mcDown事件必须保持MOUSE_DOWN。

2 个答案:

答案 0 :(得分:1)

除了在dispatchEvent中将bubbles参数设置为false之外,无法阻止冒泡。

dispatchEvent(EVENT_TYPE, BUBBLES,....);

但是,您可以通过检查来避免冒泡。只需将下面的行作为侦听器函数的第一行,它就可以避免从目标以外的所有对象调度的事件。

if(e.eventPhase != EventPhase.AT_TARGET) return;

因此,对于您的示例代码,当您单击按钮时,两个事件都会调度,但在 mcDown 函数中,它将不会在上述行之后执行。

答案 1 :(得分:0)

如果在MC中添加按钮,并且单击该按钮,则还可以单击MC,因为按钮下方的MC部分仍然存在,并且它会占用整个MC的功能,你不能删除它。

因此,最好制作一个能够检查按钮是否被按下的功能,否则它将运行整个MC的功能。

这个人应该这样做。

//add this in you constructor

mc.addEventListener(MouseEvent.MOUSE_DOWN, myReleaseFunc);
function myReleaseFunc(e:MouseEvent):void {
    if(e.currentTarget.name == Btn1) //Btn1 is instance name for a button
    {
         Btn_func1();
    }
    else if(e.currentTarget.name == Btn2) //Btn2 is another button.
    {
         Btn_func2();
         //For every button you'll need to add another function and if statement to check if that button was clicked.
    }
    else
    {
         Mc_func();
    }

} 

// this outside the main class

function Mc_func():void{
    //you code here
}
function Btn_func1():void{
    //you code here
}
function Btn_func2():void{
    //you code here
}

我认为这种方式效率更高,效果更好,速度更快,系统重载的可能性也小很多。