最初は思ったよりも難しいです。
system.setTapDelay() は機能すると思います。少なくともそのようです。しかし、それはシングル タップを排除するためのものではないというのが私の理解です。遅いダブルタップのみを受け入れます。または、この関数のドキュメントが誤解を招くだけかもしれません。いずれにせよ、コロナ開発チームが将来それを明確にすることを望みましょう.
あなたのアプリには、シングル タップに反応しなければならないオブジェクトと、ダブル タップに反応しなければならないオブジェクトがありますね。
また、両方ではなくどちらか一方に反応しなければならないオブジェクトでさえあります。ただし、この 3 番目のデザインの選択では、シングル タップの場合、ダブル タップの最初のヒットではないことを確認するまでオブジェクトを「待機」させる必要があることに注意する必要があります。フォローしますか?つまり、同じオブジェクトのシングル タップとダブル タップを区別すると、シングル タップが少し「遅れる」という結果になる可能性があります。
これらすべてを簡単な方法で実装するには、次のようにします。
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