Risposte:
@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.
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();
return falsefarlo altrimenti consumerà il tocco.
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.
getX()e getY()funziona perfettamente (non è necessario getRawX/Y()).
onInterceptTouchEvente poi tornare in falsemodo che l'evento venga elaborato normalmente.
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
})