2011-10-10 101 views
1

当我开始使用Adobe AIR为iOS/Android开发移动应用程序时,我遇到了奇怪的问题(或功能)。AS3:startDrag触发mouse_up/mouse_click事件

如果您使用MOUSE_DOWN/MOUSE_UP事件处理程序中的startDrag/stopDrag创建Sprite并使其可拖动,则一切正常。但是,如果将另一个侦听器MOUSE_CLICK添加到同一个对象,它将开始与MOUSE_UP一起触发。从逻辑上讲,这种行为是可以的。我需要的是防止当用户拖动Sprite(startDrag)时触发MOUSE_CLICK处理程序,并且当用户没有拖动Sprite时我需要触发它。

我想创建的是一个可拖动的小缩略图栏,点击具体缩略图后,它的大版本/图像打开。这实际上是不可能的,因为每次用户拖动整个缩略图栏时,MOUSE_CLICK都会触发,因此每次都会打开大图像。

回答

2

您需要添加一个标志,指定您是否处于拖动模式。如果用户按下一段时间(例如300毫秒),则设置标志并且随后忽略结束MOUSE_CLICK事件。请注意,我们在MOUSE_UP处理程序中使用1毫秒timoute来让标志重置之前的事件完成。还要注意,你并不需要点击处理程序;您可以在MOUSE_UP处理程序中调用伪点击处理程序,如果dragInProgress==false

private var dragTime:int = 300; 
private var dragInProgress:Boolean = false; 
private var dragInProgressInt:int; 

function handleMouseDown(event:MouseEvent):void 
{ 
    dragInProgressInt = setTimeout(function():void 
    { 
     dragInProgress = true; 
    }, dragTime); 

    // Start drag, etc. 
} 

function handleMouseUp(event:MouseEvent):void 
{ 
    clearTimeout(dragInProgressInt); 
    setTimeout(function():void 
    { 
     dragInProgress = false; 
    }, 1); 

    // End drag, etc. 
} 

function handleMouseClick(event:MouseEvent):void 
{ 
    if (!dragInProgress) 
    { 
     // Handle the real click 
    } 
} 

合乎逻辑的下一步是等待, 300毫秒之前,甚至开始拖动首先;当所有用户想要点击时,这将避免不必要的拖动操作的开始/停止。

编辑:更正超时名称引用中的错误。

+0

谢谢。这可能会诀窍。首先,我想创建自己的MOUSE_UP/_MOVE/_DOWN处理程序(不使用startDrag/stopDrag)。我想听到其他人的想法:) – MaRmAR

+0

实际上这可以工作,但有时用户只是不停地拖动栏,所以点击事件触发,因为他们在阅读时不断触摸屏幕。这会导致CLICK事件的意外火灾:( – MaRmAR

+0

@MaRmAR:如果您直接复制/粘贴了该代码,则出现错误。对超时的引用不正确;我已修复此问题。 –