Ошибка в реализации Android двойного нажатия

Я реализовал OnDoubleTapListener в своем классе Activity и переопределил три метода следующим образом.

@Override
    public boolean onDoubleTap(MotionEvent e) {
        // TODO Auto-generated method stub
        return true;
    }



    @Override
    public boolean onDoubleTapEvent(MotionEvent e) {
        // TODO Auto-generated method stub
        if(e.getAction() == 1){
            Toast.makeText(getApplicationContext(),"Double tap happened", Toast.LENGTH_SHORT).show();
        }
        return true;
    }



    @Override
    public boolean onSingleTapConfirmed(MotionEvent e) {
        // TODO Auto-generated method stub
        return true;
    }

Но когда я запускаю это на реальном устройстве, ничего не происходит. В чем ошибка? Кроме того, как я мог найти определенный записанный на пленку предмет (Двойной записанный на пленку предмет)?

Я видел некоторые учебные пособия, использующие метод onTouchEvent(MotionEvent e) и подсчитывающие разницу во времени между двумя касаниями. Как правильно сделать этот процесс?

2 ответа

Попробуйте это:

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) {
            float x = e.getX();
            float y = e.getY();

            Log.d("Double Tap", "Tapped at: (" + x + "," + y + ")");

            return true;
        }
    }
}

Например, GestureDetector будет использовать события касания, которые у вас уже есть для детей. Если вы не хотите, чтобы вместо этого вы могли использовать следующий код, я не буду использовать ACTION_UP поэтому мне не нужно использовать событие (будет использовано только второе нажатие)

public class DoubleTapDetector {

    public interface OnDoubleTapListener {
        boolean onDoubleTap(MotionEvent e);

        boolean onDoubleTapEvent(MotionEvent e);
    }

    private int mDoubleTapSlopSquare;

    private static final int DOUBLE_TAP_TIMEOUT = ViewConfiguration.getDoubleTapTimeout();
    private static final int DOUBLE_TAP_MIN_TIME = 40;

    private static final int DOUBLE_TAP_SLOP = 100;

    private OnDoubleTapListener mDoubleTapListener;

    private MotionEvent mCurrentDownEvent;

    public DoubleTapDetector(Context context, OnDoubleTapListener listener) {
        mDoubleTapListener = listener;
        init(context);
    }

    private void init(Context context) {
        if (mDoubleTapListener == null) {
            throw new NullPointerException("OnDoubleTapListener must not be null");
        }

        int doubleTapSlop;
        if (context == null) {
            doubleTapSlop = DOUBLE_TAP_SLOP;
        } else {
            final ViewConfiguration configuration = ViewConfiguration.get(context);
            doubleTapSlop = configuration.getScaledDoubleTapSlop();
        }
        mDoubleTapSlopSquare = doubleTapSlop * doubleTapSlop;
    }

    public boolean onTouchEvent(MotionEvent ev) {
        final int action = ev.getAction();

        boolean handled = false;

        switch (action) {
        case MotionEvent.ACTION_DOWN:
            if ((mCurrentDownEvent != null) &&
                isConsideredDoubleTap(mCurrentDownEvent, ev)) {
                // This is a second tap
                // Give a callback with the first tap of the double-tap
                handled |= mDoubleTapListener.onDoubleTap(mCurrentDownEvent);
                // Give a callback with down event of the double-tap
                handled |= mDoubleTapListener.onDoubleTapEvent(ev);
            } else {
                // This is a first tap
            }

            if (mCurrentDownEvent != null) {
                mCurrentDownEvent.recycle();
            }
            mCurrentDownEvent = MotionEvent.obtain(ev);
            break;
        }

        return handled;
    }

    private boolean isConsideredDoubleTap(MotionEvent firstDown, MotionEvent secondDown) {
        final long deltaTime = secondDown.getEventTime() - firstDown.getEventTime();
        if (deltaTime > DOUBLE_TAP_TIMEOUT || deltaTime < DOUBLE_TAP_MIN_TIME) {
            return false;
        }

        int deltaX = (int) firstDown.getX() - (int) secondDown.getX();
        int deltaY = (int) firstDown.getY() - (int) secondDown.getY();
        return (deltaX * deltaX + deltaY * deltaY < mDoubleTapSlopSquare);
    }

}

Использование:

DoubleTapDetector doubleTapDetector = new DoubleTapDetector(conversationWindow, new DoubleTapDetector.OnDoubleTapListener() {
        @Override
        public boolean onDoubleTap(MotionEvent e) {
            // Double tap detected.
            return false;
        }

        @Override
        public boolean onDoubleTapEvent(MotionEvent e) {
            return false;
        }
    });

someView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent e) {
            return doubleTapDetector.onTouchEvent(e);
        }
    });
Другие вопросы по тегам