Search code examples
androidtouchdetecttap

Android - Detect doubletap AND tripletap on view


I've been trying to build a tap detector that can detect both double and tripe tap. After my efforts failed I searched a long time on the net to find something ready to use but no luck! It's strange that libraries for something like this are so scarce. Any help ??


Solution

  • You can try something like this.

    Though I would generally recommend against using triple taps as a pattern as it is not something users are generally used to, so unless it's properly communicated to them, most might never know they can triple tap a view. Same goes for double taping actually on mobile devices, it's not always an intuitive way to interact in that environment.

    view.setOnTouchListener(new View.OnTouchListener() {
        Handler handler = new Handler();
    
        int numberOfTaps = 0;
        long lastTapTimeMs = 0;
        long touchDownMs = 0;
    
        @Override
        public boolean onTouch(View v, MotionEvent event) {
    
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    touchDownMs = System.currentTimeMillis();
                    break;
                case MotionEvent.ACTION_UP:
                    handler.removeCallbacksAndMessages(null);
    
                    if ((System.currentTimeMillis() - touchDownMs) > ViewConfiguration.getTapTimeout()) {
                        //it was not a tap
    
                        numberOfTaps = 0;
                        lastTapTimeMs = 0;
                        break;
                    }
    
                    if (numberOfTaps > 0 
                            && (System.currentTimeMillis() - lastTapTimeMs) < ViewConfiguration.getDoubleTapTimeout()) {
                        numberOfTaps += 1;
                    } else {
                        numberOfTaps = 1;
                    }
    
                    lastTapTimeMs = System.currentTimeMillis();
    
                    if (numberOfTaps == 3) {
                        Toast.makeText(getApplicationContext(), "triple", Toast.LENGTH_SHORT).show();
                        //handle triple tap
                    } else if (numberOfTaps == 2) {
                        handler.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                //handle double tap
                                Toast.makeText(getApplicationContext(), "double", Toast.LENGTH_SHORT).show();
                            }
                        }, ViewConfiguration.getDoubleTapTimeout());
                    }
            }
    
            return true;
        }
    });