Come ottenere la posizione Touch in Android?


92

Devo ottenere la posizione iniziale del tocco (X, Y), toccare la posizione dello spostamento e toccare la posizione finale dello schermo in Android.

Risposte:


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

I tre casi sono in modo da poter reagire a diversi tipi di eventi, in questo esempio toccando o trascinando o sollevando nuovamente il dito.


7
Perché restituisci falso?
Daniel Reyhanian

1
Il valore restituito true significherebbe che l'evento touch è stato gestito e ciò impedirebbe la propagazione dell'evento e viceversa.
caosificatore

27

Risposta supplementare

Dato 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;
    }
};

impostato su una vista:

myView.setOnTouchListener(handleTouch);

Questo ti dà le coordinate dell'evento di tocco relative alla vista a cui è assegnato l'ascoltatore di tocco. L'angolo in alto a sinistra della visualizzazione è (0, 0). Se sposti il ​​dito sopra la vista, ysarà negativo. Se sposti il ​​dito a sinistra della vista, xsarà negativo.

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

Se desideri le coordinate relative all'angolo superiore sinistro dello schermo del dispositivo, utilizza i valori grezzi.

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

Relazionato


Questo funziona, tuttavia nei miei test, la vista a cui viene aggiunto l'ascoltatore, non dovrebbe essere coperta da altre viste. Per ottenere le coordinate assolute della posizione toccata sullo schermo, ho aggiunto un framelayout come vista di base e sopra di esso, la vista con l'ascoltatore. Non dimenticare di return falsefarlo altrimenti consumerà il tocco.
lenooh

@lenooh getRawX()e getRawY()dovrebbe restituire le coordinate assolute della posizione di tocco su qualsiasi vista a cui è aggiunto l'ascoltatore. Ma hai ragione, se c'è un'altra vista sopra di essa che ritorna true, allora nessuna vista inferiore verrà notificata degli eventi di tocco.
Suragch

Suragch: esattamente. Dato che utilizzo un FrameLayout, ho impostato la vista su "matchParent" getX()e getY()funziona perfettamente (non è necessario getRawX/Y()).
lenooh

@ Suragch È comunque possibile registrare il tocco anche se è coperto da un'altra vista o ha i bambini come pulsanti?
vignesh kumar

@vigneshkumar, le visualizzazioni ricevono una notifica degli eventi di tocco dal basso verso l'alto (vedi il link in fondo alla mia risposta), in modo da poter registrare l'evento onInterceptTouchEvente poi tornare in falsemodo che l'evento venga elaborato normalmente.
Suragch

10
@Override
    public boolean onTouch(View v, MotionEvent event) {
       float x = event.getX();
       float y = event.getY();
       return true;
    }

0

Ecco lo stile Koltin, lo uso nel mio progetto e funziona molto bene:

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
    })
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.