Antworten:
@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;
}
In den drei Fällen können Sie auf verschiedene Arten von Ereignissen reagieren, in diesem Beispiel durch Antippen oder Ziehen oder erneutes Anheben des Fingers.
Gegeben ein 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;
}
};
auf eine Ansicht gesetzt:
myView.setOnTouchListener(handleTouch);
Auf diese Weise erhalten Sie die Koordinaten des Berührungsereignisses relativ zur Ansicht, der der Berührungslistener zugewiesen ist. Die obere linke Ecke der Ansicht ist (0, 0). Wenn Sie Ihren Finger über die Ansicht bewegen, ist ydies negativ. Wenn Sie Ihren Finger links von der Ansicht bewegen, ist xdies negativ.
int x = (int)event.getX();
int y = (int)event.getY();
Wenn Sie die Koordinaten relativ zur oberen linken Ecke des Gerätebildschirms möchten, verwenden Sie die Rohwerte.
int x = (int)event.getRawX();
int y = (int)event.getRawY();
return falsesonst wird es die Berührung verbrauchen.
getRawX()und getRawY()sollte die absoluten Koordinaten der Berührungsposition in jeder Ansicht zurückgeben, zu der der Hörer hinzugefügt wird. Aber Sie haben Recht, wenn darüber eine andere Ansicht zurückgegeben truewird, werden keine niedrigeren Ansichten über Berührungsereignisse benachrichtigt.
getX()und getY()arbeite einwandfrei (keine Notwendigkeit getRawX/Y()).
onInterceptTouchEventund dann zurückkehren können, falsedamit das Ereignis wie gewohnt verarbeitet wird.
Hier ist der Koltin-Stil, den ich in meinem Projekt verwende und der sehr gut funktioniert:
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
})