CustomCanvasView
を拡張するクラスがあり、クラスのView
クリック、ドラッグ、およびピンチズームを実装しました。今、私は長いクリックを実装したいと考えています。
さまざまな投稿で読んだことから、誰もがこれを行う方法が異なりますが、一般的なコンセンサスは、 anOnLongClickListener
または a のいずれかを使用する必要があるようGestureDetector
です。ただし、長いクリックの正確な座標が必要であり、これらのアプローチが私のonTouch()
方法で動作しているものとうまく機能しないのではないかと心配しています.
では、これらの特定のニーズに本当に最適なアプローチはどれでしょうか?
アップデート
そこで、イベントの場合に設定startTime = System.nanoTime();
して時間を手動で測定することにしました。ACTION_DOWN
onTouch(...)
estimatedTime = System.nanoTime() - startTime;
seconds = (double) estimatedTime / 1000000000.0;
この値が 1 を超えるかどうかをテストしましたACTION_UP
。これでうまくいったので、触覚フィードバックを追加したいと思いました。
これらはすべて (アクティビティではなく) クラス内で処理されるため、クリックに関する情報を関連付けられたアクティビティに渡し、Vibrator
長いクリックの場合は を使用してデバイスを振動させることにしました。これも動作しますが、長いクリックが終了するまで情報が渡されないため、振動が発生します。
私が使用したアプリでは、指を離したときに触覚フィードバックが適切に発生するため、指を離す前に長いクリックの時間しきい値を超えたことがわかります。アプリのロジック全体を作り直さずに、ここでそれを行う方法はありますか? つまり、内部クラス内から電話を振動させることはできますか?
アップデート
触覚フィードバックを以前よりもうまく機能させる方法を見つけました。まだ完璧ではありませんが、これが私がやった方法です。
. estimatedTime
_ ACTION_UP
_ onTouch(...)
_ timerStarted
_ true
_ ACTION_DOWN
_ onTouch(...)
_ estimatedTime
_ しきい値を超えた場合は、関連するアクティビティに触覚フィードバックを提供するように指示します。mode = LONG_CLICK
また、ケースにこの情報があるように設定しましたACTION_UP
。
すべての適切な場所に設定していることを確認する必要があるだけですtimerStarted = false
(つまり、イベントがズーム イベント、ドラッグ イベント、またはクリック イベントであると判断した場合)。
ありがとう!