8

最初にシングルタップをトリガーせずにダブルタップを検出したいのですが。私はダブルクリックリスナーを試しましたが、ダブルが検出される前に常に onSingleTapUp を取得します。これは妥当だと思います。しかし、私のアプリでは、途中でダブルクリックしたときにシングルクリックのコールバックが本当に必要ありません。

未来を予測できるアプリはありません(そうでなければ、本当に金持ちになるでしょう)が、シングルクリックでタイマーを起動し、タイムアウト内にダブルクリックがない場合は、シングルクリックを行うことを考えていました。しかし、タイマーを開始してタイマーが実行されると、2回目のタップでイベントが生成されないため、機能していないようです。これがayncタスクを使用した私のコードです。タイマーでも試しました。

mGD = new GestureDetector(getContext(), new SimpleOnGestureListener() {

            @Override
            public boolean onSingleTapUp(MotionEvent ev) {
                //Log.d("KitView", "onSingleTapUp "+ev.toString());

                class DblTapTask extends AsyncTask<Void, Void, Void> {

                    @Override
                    protected void onPreExecute() {
                        Log.d("KitView", "onPreExecute");
                    }

                    protected Void doInBackground(Void... args) {
                        Log.d("KitView", "doInBackground");
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        return null;
                    }

                    protected void onPostExecute(Void result) {
                        Log.d("KitView", "onPostExecute");
                                            doSigleTapAction();
                        mDblTapTask=null;
                    }
                };

                if(mDblTapTask==null) {
                    Log.d("KitView", "START TASK");
                    mDblTapTask = new DblTapTask();
                    mDblTapTask.execute();
                } else {
                    Log.d("KitView", "TASK RUNNING");
                                    doDoubleTapAction();
                }


                Log.d("KitView", "onSingleTapUp DONE");
                return true;
            }   // end onSingleTapUp

        });     // end new GestureDetector

この例では、最初のタップで問題なく onSingleTapUp を取得します。doInBackground でのテストのタイムアウトは 1 秒なので、2 回目のタップを行う時間は十分にあります。Log.d("KitView", "onSingleTapUp DONE"); に注意してください。すぐに実行されます。最初のタップを行うため、onSingleTapUp はハングしません。

問題は、1 秒以内にもう一度テーピングしても何も起こらないことです。スリープが終了して onPostExecute が実行されるまで、onSingleTapUp への呼び出しはありません。だから Log.d("KitView", "TASK RUNNING"); もちろん、ダブルクリックとシングルクリックを検出する場所は決して起こりません。

aynctask がイベントをブロックしている理由がわかりません。アイデアはありますか? ありがとう

4

4 に答える 4

19

私はあなたが達成しようとしていることについて混乱しています。onDoubleTap()シングルタップが発生した場合、ダブルタップメソッドは呼び出されません。一方、ダブルタップごとに、2つの関連するシングルタップonSingleTapUp()メソッド呼び出しがあります。

それらを区別したい場合は、ジェスチャ検出器がタップシングルonSingleTapConfirmed()であると確認したときにトリガーされるを使用できます。参考資料を参照してください:

シングルタップが発生したときに通知されます。

とは異なりOnGestureListener.onSingleTapUp(MotionEvent)、これは、ユーザーの最初のタップの後にダブルタップジェスチャにつながる2番目のタップが続かないことを検出器が確信した後にのみ呼び出されます。

次に、このメソッド呼び出しをフラグと組み合わせて使用​​して、boolean基本的にあらゆるタイプのシングル/ダブルタップを検出できます。

于 2013-02-06T08:16:38.383 に答える
5

以下のようにしてみてください:

GestureDetector を使用できます。次のコードを参照してください。

public class MyView extends View {

GestureDetector gestureDetector;

public MyView(Context context, AttributeSet attrs) {
    super(context, attrs);
            // creating new gesture detector
    gestureDetector = new GestureDetector(context, new GestureListener());
}

// skipping measure calculation and drawing

    // delegate the event to the gesture detector
@Override
public boolean onTouchEvent(MotionEvent e) {
    return gestureDetector.onTouchEvent(e);
}


private class GestureListener extends GestureDetector.SimpleOnGestureListener {

    @Override
    public boolean onDown(MotionEvent e) {
        return true;
    }
    // event when double tap occurs
    @Override
    public boolean onDoubleTap(MotionEvent e) {
        Log.d("Double Tap", "Tapped Occured.");
        return true;
    }
}
}

リスナーの他のメソッドをオーバーライドして、シングル タップやフリンジなどを取得できます。

于 2013-02-06T08:11:41.190 に答える
2

私はそれを理解したと思う

@Override
            public  boolean     onSingleTapConfirmed(MotionEvent e) {
                Log.d("KitView", "onSingleTapConfirmed");
                return true;
            }
            @Override
            public boolean onDoubleTap(MotionEvent e) {
                Log.d("KitView", "onDoubleTap");
                return true;
            }

ダブルタップしても onSingleTapConfirmed は呼び出されない

于 2013-02-06T08:24:02.133 に答える
0

blew を参照できます: onTouchEvent() メソッドをオーバーライドします

最初のダウンでは、時間を記録します。2 回目のダウンが発生すると、前回のダウン タイムと比較し、それらが 150 ミリ秒以下の場合は、ダブル タップであるというメッセージを投稿します。

于 2013-02-06T08:42:29.590 に答える