How to add a gesture detector to a view in Android
This example shows how to add a gesture detector to a view. The layout is just a single View
inside of an Activity. You can use the same method to add a gesture detector to any type of view.
We will add the gesture detector to the green View
.
MainActivity.java
The basic idea is to add an OnTouchListener
to the view. Normally we would get all the raw touch data here (like ACTION_DOWN
, ACTION_MOVE
, ACTION_UP
, etc.), but instead of handling it ourselves, we will forward it on to a gesture detector to do the interpretation of the touch data.
We are using a SimpleOnGestureListener
. The nice thing about this gesture detector is that we only need to override the gestures that we need. In the example here I included a lot of them. You can remove the ones you don't need. (You should always return true
in onDown()
, though. Returning true means that we are handling the event. Returning false will make the system stop giving us any more touch events.)
public class MainActivity extends AppCompatActivity { private GestureDetector mDetector; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // this is the view we will add the gesture detector to View myView = findViewById(R.id.my_view); // get the gesture detector mDetector = new GestureDetector(this, new MyGestureListener()); // Add a touch listener to the view // The touch listener passes all its events on to the gesture detector myView.setOnTouchListener(touchListener); } // This touch listener passes everything on to the gesture detector. // That saves us the trouble of interpreting the raw touch events // ourselves. View.OnTouchListener touchListener = new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // pass the events to the gesture detector // a return value of true means the detector is handling it // a return value of false means the detector didn't // recognize the event return mDetector.onTouchEvent(event); } }; // In the SimpleOnGestureListener subclass you should override // onDown and any other gesture that you want to detect. class MyGestureListener extends GestureDetector.SimpleOnGestureListener { @Override public boolean onDown(MotionEvent event) { Log.d("TAG","onDown: "); // don't return false here or else none of the other // gestures will work return true; } @Override public boolean onSingleTapConfirmed(MotionEvent e) { Log.i("TAG", "onSingleTapConfirmed: "); return true; } @Override public void onLongPress(MotionEvent e) { Log.i("TAG", "onLongPress: "); } @Override public boolean onDoubleTap(MotionEvent e) { Log.i("TAG", "onDoubleTap: "); return true; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { Log.i("TAG", "onScroll: "); return true; } @Override public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) { Log.d("TAG", "onFling: "); return true; } }}
It is a quick setup to run this project, so I recommend you try it out. Notice how and when the log events occur.
short version in kotlin to detect double tap only for a view:
val gestureDetector = GestureDetector(activity, object : GestureDetector.SimpleOnGestureListener() { override fun onDoubleTap(e: MotionEvent?): Boolean { Log.d("myApp", "double tap") return true }})myView.setOnTouchListener { _, event -> gestureDetector.onTouchEvent(event) }
and don't forget to make myView
clickable