我试图在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
如果我们知道它不会是双击,我怎么能防止电晕点火?
答案 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