Android обнаруживает двойное касание без единого касания

Я хотел бы обнаружить двойное нажатие НО, не вызывая ни одного нажатия в первую очередь. Я пробовал слушателей двойного щелчка, но вы всегда получаете onSingleTapUp до того, как двойной обнаружен, что вполне разумно, я думаю. но в моем приложении я действительно не хочу обратного вызова одним щелчком, когда есть двойной щелчок по пути.

Я понимаю, что ни одно приложение не может предсказать будущее (или я был бы по-настоящему богатым), но я подумал, просто запустите таймер на один щелчок, и если в течение некоторого времени не будет двойного щелчка, сделайте один щелчок. но это, похоже, не работает, потому что, как только я запускаю таймер и таймер работает, второе нажатие никогда не генерирует событие. Вот мой код с использованием задачи 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 просто отлично при первом нажатии. Мой тайм-аут составляет 1 секунду для тестирования в doInBackground, поэтому у меня есть много времени, чтобы выполнить второе нажатие. обратите внимание, что Log.d("KitView", "onSingleTapUp DONE"); запускается сразу, я делаю первый тап, поэтому onSingleTapUp не висит.

проблема в том, что повторное нажатие в течение 1сек ничего не делает. нет вызова onSingleTapUp до тех пор, пока не закончится сон и не запустится onPostExecute. so Log.d("KitView", "ЗАДАЧА ЗАДАЧИ"); никогда не происходит, где я бы обнаружил двойной щелчок против одного клика, конечно.

я не уверен, почему aynctask блокирует события, какие-либо идеи? Спасибо

4 ответа

Решение

Я запутался в том, чего ты пытаешься достичь. Метод двойного нажатия onDoubleTap() не вызывается, когда происходит одно касание. С другой стороны, для каждого двойного касания есть два связанных одиночных касания. onSingleTapUp() вызовы методов.

Если вы хотите различить их, вы можете использовать onSingleTapConfirmed() который срабатывает, когда детектор жестов уверен, что касание одиночное. Смотрите ссылку:

Уведомляется, когда происходит одно касание.

В отличие от OnGestureListener.onSingleTapUp(MotionEvent), это будет вызвано только после того, как детектор уверен, что за первым касанием пользователя не последует второе касание, ведущее к жесту двойного касания

Затем вы можете использовать этот вызов метода в сочетании с boolean флаг для обнаружения любого типа одиночного / двойного касания.

Попробуйте, как показано ниже:

Вы можете использовать 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;
    }
}
}

Вы можете переопределить другие методы слушателя, чтобы получить одиночные нажатия, щелчки и так далее.

Я думаю, я понял это

@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 не вызывается, когда я делаю двойное нажатие, красиво и легко

Можно сослаться на blew: переопределить методу onTouchEvent()

во первых вниз мы запишем время. когда наступает второе падение, мы сравниваем последнее время простоя с ним, если оно составляет 150 мс или меньше, мы опубликуем сообщение о том, что это двойное касание.

Другие вопросы по тегам