2

我正在尝试检测 Corona SDK 中的单击和双击。我使用过:

system.setTapDelay(0.5)

...在我的 main.lua 文件中,我理解这将确保不会传递单个点击事件,除非在 0.5 秒内没有收到进一步的点击事件。根据文档,延迟以秒而不是毫秒为单位指定,因此为 0.5。

然后我利用了这个:

function mapGroup:tap(event)
    if event.numTaps >= 2 then
        print "double tap"
    else
        print "single tap"
    end
    return true
end

正如预期的那样,这将返回单击和双击。但是,它会为双击触发两次:

single tap
double tap

在我们知道它不会是双击之前,如何防止 Corona 触发单击?

4

1 回答 1

1

这比起初看起来更棘手。

我认为 system.setTapDelay() 确实有效。至少看起来如此。但我的理解是,这并不意味着要排除单击。只接受较慢的双击。或者这个函数的文档可能只是误导。无论如何,让我们希望 Corona 开发团队在未来澄清这一点。

现在,在您的应用程序中,您有必须对单击做出反应的对象,以及必须对双击做出反应的对象,对吗?

甚至可能是必须对一个或另一个做出反应的对象,但不能同时对两者做出反应。但是您必须注意,使用第三种设计选择时,如果单击,您的对象将不得不“等待”,直到确定它不是双击的第一次。你跟着?换句话说,要区分对同一对象的单击和双击可能会导致单击“滞后”一点。

为了以简单的方式实现所有这些,我会这样:

function onSingleTap( event )
    if event.numTaps == 1 then
        print("received a single tap")
    end
end

objectThatRespondsToSingleTapOnly:addEventListener( "tap", onSingleTap )

function onDoubleTap( event )
    if event.numTaps >= 2 then
        print("received a double tap")
    end
end

objectThatRespondsToDoubleTapOnly:addEventListener( "tap", onDoubleTap )

现在,如果您还想要区分单人与双人的对象,您可以添加:

local doubleTapTimeout = 600 -- values under 300 become hard to use
-- BTW make this a little higher than the tap delay, if you set it manually

function onExclusiveSingleTap( event )
    print("received an exclusive single tap")
end

function onExclusiveDoubleTap( event )
    print("received an exclusive double tap")
end

function onExclusiveTap( event )
    if event.numTaps == 1 then
        event.target.singleTapWaiting = timer.performWithDelay(
            doubleTapTimeout,
            function(e) onExclusiveSingleTap( event ) end
        )
    elseif event.numTaps >= 2 then
        timer.cancel( event.target.singleTapWaiting )
        onExclusiveDoubleTap( event )
    end
end

objectThatRespondsToBothTaps:addEventListener( "tap", onExclusiveTap )

我只是想知道你是否不应该在 Lua 闭包中复制事件对象的值而不是传递它的引用,这可能会导致一些内存泄漏。

function(e) onExclusiveSingleTap( {
    name = "tap",
    x = event.x,
    y = event.y,
    numTaps = 1,
    target = event.target
} ) end
于 2013-01-11T19:57:51.480 回答