0

CustomCanvasViewを拡張するクラスがあり、クラスのViewクリック、ドラッグ、およびピンチズームを実装しました。今、私は長いクリックを実装したいと考えています。

さまざまな投稿で読んだことから、誰もがこれを行う方法が異なりますが、一般的なコンセンサスは、 anOnLongClickListenerまたは a のいずれかを使用する必要があるようGestureDetectorです。ただし、長いクリックの正確な座標が必要であり、これらのアプローチが私のonTouch()方法で動作しているものとうまく機能しないのではないかと心配しています.

では、これらの特定のニーズに本当に最適なアプローチはどれでしょうか?

アップデート

そこで、イベントの場合に設定startTime = System.nanoTime();して時間を手動で測定することにしました。ACTION_DOWNonTouch(...)

 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(つまり、イベントがズーム イベント、ドラッグ イベント、またはクリック イベントであると判断した場合)。

ありがとう!

4

1 に答える 1

1

カスタムロングタッチ検出の場合、使用できますTimerTask

以下はサンプルコードです

public Timer mTIMERForLongTouch;
Handler mHandler = new Handler(){};
int mTIMEForLongTouch=0;
float longTouchX, longTouchY;

if(event.getAction()==MotionEvent.ACTION_DOWN)
{
// longTouchX & longTouchY is x-y coordinate of long touch
longTouchX = event.getX();
longTouchY = event.getY();
mTIMERForLongTouch = new Timer();
mTIMERForLongTouch.schedule(new TimerTask() {
        @Override
        public void run() {
            mTIMEForLongTouch+= 100;
            if(mTIMEForLongTouch>1500)
            {
                mHandler.post(new Runnable() 
                {
                    public void run() 
                    {
                        Toast.makeText(context, "Long Touch", Toast.LENGTH_SHORT).show();
                        mTIMERForLongTouch.cancel();
                        mTIMEForLongTouch=0;

                    }
                });
            }
        }
    }, 0,100);
}
else if(event.getAction()==MotionEvent.ACTION_UP)
{
    mTIMEForLongTouch=0;
    mTIMERForLongTouch.cancel();
}
于 2013-07-20T10:13:30.077 に答える