108

I need to get the touch begin position (X, Y) , touch move position and touch end position of the screen in android.

4 Answers 4

192
@Override public boolean onTouchEvent(MotionEvent event) { int x = (int)event.getX(); int y = (int)event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: case MotionEvent.ACTION_UP: } return false; } 

The three cases are so that you can react to different types of events, in this example tapping or dragging or lifting the finger again.

Sign up to request clarification or add additional context in comments.

2 Comments

Why do you return false?
The return value of true would mean that the touch event was handled and that would prevent the event from propagating and vice versa.
38

Supplemental answer

Given an OnTouchListener

private View.OnTouchListener handleTouch = new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { int x = (int) event.getX(); int y = (int) event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: Log.i("TAG", "touched down"); break; case MotionEvent.ACTION_MOVE: Log.i("TAG", "moving: (" + x + ", " + y + ")"); break; case MotionEvent.ACTION_UP: Log.i("TAG", "touched up"); break; } return true; } }; 

set on some view:

myView.setOnTouchListener(handleTouch); 

This gives you the touch event coordinates relative to the view that has the touch listener assigned to it. The top left corner of the view is (0, 0). If you move your finger above the view, then y will be negative. If you move your finger left of the view, then x will be negative.

int x = (int)event.getX(); int y = (int)event.getY(); 

If you want the coordinates relative to the top left corner of the device screen, then use the raw values.

int x = (int)event.getRawX(); int y = (int)event.getRawY(); 

Related

5 Comments

This works, however in my testing, the view to which the listener is added, should not be covered by other views. To get absolute coordinates of the touched position on screen, I added a framelayout as base view, and on top of it, the view with the listener. Don't forget to return false otherwise it will consume the touch.
@lenooh, getRawX() and getRawY() should return the absolute coordinates of the touch position on any view the listener is added to. But you're right, if there is another view on top of it that returns true, then no lower views will be notified of touch events.
Suragch: exactly. Since I use a FrameLayout, I set the view to "matchParent" so getX() and getY() work just fine (no need for getRawX/Y()).
@Suragch Is there anyway to record touch even if it is covered by some other view or has children like buttons?
@vigneshkumar, views are notified of touch events from the bottom up (see the link at the bottom of my answer), so you could record the event in onInterceptTouchEvent and then return false so that the event is processed as normal.
11
@Override public boolean onTouch(View v, MotionEvent event) { float x = event.getX(); float y = event.getY(); return true; } 

Comments

1

Here is the Koltin style, I use this in my project and it works very well:

this.yourview.setOnTouchListener(View.OnTouchListener { _, event -> val x = event.x val y = event.y when(event.action) { MotionEvent.ACTION_DOWN -> { Log.d(TAG, "ACTION_DOWN \nx: $x\ny: $y") } MotionEvent.ACTION_MOVE -> { Log.d(TAG, "ACTION_MOVE \nx: $x\ny: $y") } MotionEvent.ACTION_UP -> { Log.d(TAG, "ACTION_UP \nx: $x\ny: $y") } } return@OnTouchListener true }) 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.