2012-12-19 131 views
2

我試圖在Corona SDK中檢測單擊和雙擊。我已經使用:Corona:雙擊/單擊

system.setTapDelay(0.5) 

...在我明白這將確保除非進一步挖掘事件尚未在0.5秒內收到不獲通過一個單一的水龍頭事件我main.lua文件。根據文檔,延遲以秒爲單位而不是毫秒,因此爲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

它比起初看起來更棘手。

我認爲system.setTapDelay()確實有效。至少它似乎。 但我的理解是,這並不意味着排除單擊。只接受較慢的雙擊。或者,也許這個功能的文檔只是誤導。無論如何,我們希望Corona dev團隊將來能夠澄清這一點。

現在,在您的應用程序中,您必須具有必須對單個水龍頭做出反應的對象,以及必須對雙擊進行反應的對象才能正確?

甚至可能對象必須對一個或另一個做出反應,但對兩者都不起作用。但是你必須意識到,通過這個第三個設計選擇,如果單擊一次,你的物體將不得不「等」,直到它確定它不是雙擊的第一擊。你跟着?換句話說,要區分同一物體上的單擊和雙擊可能會導致單擊「滯後」一點。

要實現這一切在一個簡單的方法,我會是這樣的:

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 closure中的事件對象的值而不是傳遞其引用,這可能會導致一些內存泄漏。

function(e) onExclusiveSingleTap({ 
    name = "tap", 
    x = event.x, 
    y = event.y, 
    numTaps = 1, 
    target = event.target 
}) end