AS3:startDrag触发mouse_up / mouse_click事件

时间:2011-10-10 17:57:51

标签: flash actionscript-3

当我开始使用Adobe AIR为iOS / Android开发移动应用程序时遇到了奇怪的问题(或功能)。

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

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

1 个答案:

答案 0 :(得分: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毫秒;当所有用户想要点击时,这将避免不必要的启动/停止拖动操作。

编辑:修正了对超时名称的引用中的错误。