Respostas:
@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;
}
Os três casos são para que você possa reagir a diferentes tipos de eventos, neste exemplo, tocar ou arrastar ou levantar o dedo novamente.
Dado um 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;
}
};
definido em alguma vista:
myView.setOnTouchListener(handleTouch);
Isso fornece as coordenadas do evento de toque relativas à visualização que possui o ouvinte de toque atribuído a ela. O canto superior esquerdo da visualização é (0, 0). Se você mover o dedo acima da visualização, o resultado yserá negativo. Se você mover o dedo para a esquerda da visualização, o resultado xserá negativo.
int x = (int)event.getX();
int y = (int)event.getY();
Se você quiser as coordenadas relativas ao canto superior esquerdo da tela do dispositivo, use os valores brutos.
int x = (int)event.getRawX();
int y = (int)event.getRawY();
return falsesenão consumirá o toque.
getRawX()e getRawY()deve retornar as coordenadas absolutas da posição de toque em qualquer visualização à qual o ouvinte é adicionado. Mas você está certo, se houver outra visualização em cima dela que retorne true, nenhuma visualização inferior será notificada sobre eventos de toque.
getX()e getY()funciona perfeitamente (não há necessidade getRawX/Y()).
onInterceptTouchEvente retornar falsepara que o evento seja processado normalmente.
Aqui está o estilo Koltin, uso no meu projeto e funciona muito bem:
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
})