电晕:双击/单击

时间:2012-12-19 08:44:36

标签: corona tap

我试图在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

如果我们知道它不会是双击,我怎么能防止电晕点火?

1 个答案:

答案 0 :(得分: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