2010-09-22 51 views
0

我已经创建了一个带有标题栏的简单面板,并且我试图在MouseEvent.MOUSE_DOWN,MouseEvent.MOUSE_CLICK和MouseEvent.DOUBLE_CLICK之间共享标题栏。鼠标向下,面板可拖动,鼠标点击面板折叠并展开,鼠标双击面板隐藏。ActionScript - 使用多个鼠标事件显示对象?

我努力使这些全部与面板的标题栏精灵一起工作。鼠标向下时会激活点击,等等。是否可以在同一个对象上区分这些鼠标事件?


我忘了提,我是编程的AIR应用程序,因此,虽然我相信下面帕特里克的解决方案将针对定制拖放功能的常规.swf文件或一个工作,我真的不可以访问nativeWindow的startMove()函数。然而,我设法通过轮询nativeWindow的位置来共享面板的MOUSE_DOWN和MOUSE_CLICK事件之间的titleBar对象。

private function titleBarMouseDownEventHandler(evt:MouseEvent):void 
    { 
    windowCoords = new Point(stage.nativeWindow.x, stage.nativeWindow.y); 
    stage.nativeWindow.startMove(); 
    } 

private function titleBarClickEventHandler(evt:MouseEvent):void 
    { 
    if (stage.nativeWindow.x != windowCoords.x && stage.nativeWindow.y != windowCoords.y) 
     return; 

    //expand & collapse code 
    } 

回答

1

是的,你可以检查的事件类型,并添加一个条件为你的函数来执行

 

private function mouseEventHandler(event:MouseEvent):void 
{ 
    switch(event.type) 
    { 
     case MouseEvent.MOUSE_DOWN: 
       dragClip(); 
       break; 

     case MouseEvent.CLICK: 
       removeListeners(); 
       clickHandler(); 
       break; 
    } 

} 

private function dragClip():void 
{ 
    //remove listeners while you're dragging 
    //add them back on mouse up 
    removeListeners(); 
} 

private function clickHandler():void 
{ 
    //do what you need 
    //then re-add the event listeners when the action is done 
    addListeners(); 
} 

,如果你仍然不能区分使用这种方法,您可能需要创建第二个处理器冲突的功能...来想想它,你也可以考虑禁用其他鼠标事件处理程序,当一个是活跃的......只是一个想法

+0

当然,我可以将它们全部发送到他们自己的监听器功能或检查哪个事件类型被激活,但问题是一个会引发另一个事件类型。例如:我将鼠标放在面板上将其拖动到新的位置,但是当我放开鼠标时,面板将展开/折叠,因为展开/折叠操作正在监听鼠标单击。我尝试删除mousedown的click事件监听器并在mouseup中重新添加它,但结果是click事件从未发生过。 – TheDarkIn1978 2010-09-22 14:50:31

+0

您可能必须建立某种形式的优先级,假设您使用switch语句,使用event.type,第一个语句将优先 – PatrickS 2010-09-22 14:55:23

+0

唯一我能想到的其他事情是使用定时器,但那会是超级贫民窟。 – TheDarkIn1978 2010-09-22 14:59:55

0

是的,但你必须小心你的声明的顺序事件(不知道哪一个应该先走,尽管......)。