2

短いバージョン:手動のLongTouch検出として、onTouchEventで時間ベースのカウンターを開始し、応答する前に一定の時間が経過したかどうかをテストする方法が必要です。

説明:2本指のフリングで画面の内外にスライドするカスタムimageViewがあります。ドラッグイベントを追加したいのですが、長押しよりも速くする必要があります。onTouchEventごとに1回更新され、ドラッグをトリガーするカウンター(たとえば、10カウント)を使用してドラッグイベントを遅らせることができますが、カウンターはタッチイベントでのみ更新され、指が動いている必要があります。

時間ベースのカウンター、1秒間に60回インクリメントされるアクティビティレベルフィールドなどを作成するにはどうすればよいですか?

4

4 に答える 4

8

質問からはわかりませんが、ACTION_UPイベントが発生する前に何らかのロジックを実行する必要がある場合を除いて、onTouchListenerにcatchlongclickイベントを実装しようとしているようです。もしそうなら、それは私が抱えていたのとまったく同じ問題です。System.nanoTime()も使用してみましたが、それほどトリッキーではないメソッドを見つけました。タイマーを使用できます。最初のACTION_DOWNイベントでタイマーをスケジュールし、何か不利なことが起こったときにキャンセルする必要があります(ACTION_UPは、長押しではなくクリックするだけでした。またはACTION_MOVEで、特定のしきい値)。次のようなもの:

layout.seyOnTouchListener(new OnTouchListener(){
    private Timer longpressTimer; //won't depend on a motion event to fire
    private final int longpressTimeDownBegin = 500; //0.5 s
    private Point previousPoint;

    switch(event.getAction()){

    case MotionEvent.ACTION_DOWN:{
        longPressTimer = new Timer();
        longpressTimer.schedule(new TimerTask(){
            //whatever happens on a longpress
        }, longpressTimeDownBegin);
        return true; //the parent was also handling long clicks
    }
    case MotionEvent.ACTION_MOVE:{
        Point currentPoint = new Point((int)event.getX(), (int)event.getY());

        if(previousPoint == null){
            previousPoint = currentPoint;
        }
        int dx = Math.abs(currentPoint.x - previousPoint.x);
        int dy = Math.abs(currentPoint.y - previousPoint.y);
        int s = (int) Math.sqrt(dx*dx + dy*dy);
        boolean isActuallyMoving = s >= minDisToMove; //we're moving

        if(isActuallyMoving){ //only restart timer over if we're actually moving (threshold needed because everyone's finger shakes a little)
            cancelLongPress();
            return false; //didn't trigger long press (will be treated as scroll)
        }
        else{ //finger shaking a little, so continue to wait for possible long press
            return true; //still waiting for potential long press
        }
    }
    default:{
        cancelLongPress();
        return false;
    }
    }
}
于 2012-07-30T20:41:09.217 に答える
1

アンドロイドのソースコードを見てください。

GestureDetectorを長押しすると、「キーダウン」時に遅延メッセージが開始されます。このメッセージが「キーアップ」の前に表示される場合は、長押しします。

ソースへのリンク http://www.devdaily.com/java/jwarehouse/android/core/java/android/view/GestureDetector.java.shtml

于 2012-04-06T18:25:14.190 に答える
1

これにアプローチする方法は、Action_Downが発生したときにブール値をtrueに設定することです。action_upが発生した場合は、ブール値をfalseに設定します。また、action_downが発生したときに、必要な遅延に設定されたpostDelayedを開始します。postdelayedで、以前にtrueに設定したブール値がまだtrueである場合は、必要な処理を実行します。そのような言葉の答えで申し訳ありませんが、それは私がそれをする方法です。

于 2012-04-06T18:33:10.873 に答える
0

回答:システムクロック(elapsedRealtime())を使用して、プレスが開始されてからのミリ秒を測定します。一度コツをつかみ始めたら簡単です。

于 2013-01-28T20:59:46.167 に答える