¿Cómo obtener la posición Touch en Android?

92

Necesito obtener la posición de inicio táctil (X, Y), la posición de movimiento táctil y la posición final táctil de la pantalla en Android.

Alex
fuente

Respuestas:

169
@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;
}

Los tres casos son para que pueda reaccionar a diferentes tipos de eventos, en este ejemplo tocando o arrastrando o levantando el dedo nuevamente.

dbrettschneider
fuente
7
¿Por qué devuelve falso?
Daniel Reyhanian
1
El valor devuelto de verdadero significaría que el evento táctil fue manejado y eso evitaría que el evento se propague y viceversa.
caosificador
27

Respuesta suplementaria

Dado un 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;
    }
};

establecido en alguna vista:

myView.setOnTouchListener(handleTouch);

Esto le da las coordenadas del evento táctil en relación con la vista que tiene asignado el oyente táctil. La esquina superior izquierda de la vista es (0, 0). Si mueve el dedo por encima de la vista, yserá negativo. Si mueve el dedo a la izquierda de la vista, xserá negativo.

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

Si desea las coordenadas relativas a la esquina superior izquierda de la pantalla del dispositivo, utilice los valores sin procesar.

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

Relacionado

Suragch
fuente
Esto funciona, sin embargo, en mis pruebas, la vista a la que se agrega el oyente no debería estar cubierta por otras vistas. Para obtener las coordenadas absolutas de la posición tocada en la pantalla, agregué un diseño de marco como vista base y, encima, la vista con el oyente. No olvides de lo return falsecontrario consumirá el toque.
lenooh
@lenooh, getRawX()y getRawY()debe devolver las coordenadas absolutas de la posición táctil en cualquier vista a la que se agregue el oyente. Pero tiene razón, si hay otra vista encima que regresa true, no se notificarán los eventos táctiles de las vistas inferiores.
Suragch
Suragch: exactamente. Como utilizo un FrameLayout, configuro la vista en "matchParent" getX()y funciono getY()bien (no es necesario getRawX/Y()).
lenooh
@Suragch ¿Existe alguna forma de grabar el toque incluso si está cubierto por alguna otra vista o si los niños tienen botones como?
vignesh kumar
@vigneshkumar, las vistas son notificadas de los eventos táctiles de abajo hacia arriba (vea el enlace en la parte inferior de mi respuesta), por lo que puede registrar el evento onInterceptTouchEventy luego regresar falsepara que el evento se procese normalmente.
Suragch
10
@Override
    public boolean onTouch(View v, MotionEvent event) {
       float x = event.getX();
       float y = event.getY();
       return true;
    }
Sephy
fuente
0

Aquí está el estilo Koltin, lo uso en mi proyecto y funciona muy bien:

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
    })
cjung
fuente