How to get the Touch position in android?
Asked Answered
L

4

107

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

Liquefy answered 13/8, 2010 at 12:30 Comment(0)
P
191
@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.

Pettus answered 13/8, 2010 at 12:37 Comment(2)
Why do you return false?Corbitt
The return value of true would mean that the touch event was handled and that would prevent the event from propagating and vice versa.Gerius
P
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

Pacificas answered 20/9, 2016 at 8:12 Comment(5)
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.Agar
@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.Pacificas
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()).Agar
@Pacificas Is there anyway to record touch even if it is covered by some other view or has children like buttons?Deragon
@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.Pacificas
B
11
@Override
    public boolean onTouch(View v, MotionEvent event) {
       float x = event.getX();
       float y = event.getY();
       return true;
    }
Biodynamics answered 13/8, 2010 at 12:34 Comment(0)
N
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
    })
Nealneala answered 29/1, 2019 at 8:29 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.