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

これは、予想どおり、シングルタップとダブルタップを返します。ただし、ダブルタップで 2 回発火しています。

single tap
double tap

ダブルタップではないことがわかるまで、コロナがシングルタップを発射するのを防ぐにはどうすればよいですか?

4

1 に答える 1

1

最初は思ったよりも難しいです。

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
于 2013-01-11T19:57:51.480 に答える