Muszę uzyskać dotknięcie pozycji początkowej (X, Y), dotknięcia pozycji przesunięcia i dotknięcia pozycji końcowej ekranu w Androidzie.
92
@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;
}
Te trzy przypadki są po to, abyś mógł reagować na różne typy zdarzeń, w tym przykładzie ponownie dotykając, przeciągając lub podnosząc palec.
Dodatkowa odpowiedź
Biorąc pod uwagę
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; } };
ustawione na jakiś widok:
myView.setOnTouchListener(handleTouch);
Zapewnia to współrzędne zdarzenia dotyku względem widoku, do którego jest przypisany odbiornik dotyku. W lewym górnym rogu widoku jest
(0, 0)
. Jeśli przesuniesz palcem nad widok,y
będzie ujemny. Jeśli przesuniesz palcem w lewo od widoku,x
będzie to wartość ujemna.int x = (int)event.getX(); int y = (int)event.getY();
Jeśli chcesz mieć współrzędne względem lewego górnego rogu ekranu urządzenia, użyj surowych wartości.
int x = (int)event.getRawX(); int y = (int)event.getRawY();
Związane z
źródło
return false
przeciwnym razie pochłonie dotyk.getRawX()
igetRawY()
powinien zwrócić bezwzględne współrzędne pozycji dotyku w każdym widoku, do którego jest dodawany słuchacz. Ale masz rację, jeśli na wierzchu jest inny widok, który powracatrue
, żadne dolne widoki nie będą powiadamiane o zdarzeniach dotykowych.getX()
igetY()
działać dobrze (nie ma potrzebygetRawX/Y()
).onInterceptTouchEvent
a następnie wrócić,false
aby zdarzenie było przetwarzane normalnie.@Override public boolean onTouch(View v, MotionEvent event) { float x = event.getX(); float y = event.getY(); return true; }
źródło
Oto styl Koltin, używam tego w swoim projekcie i działa bardzo dobrze:
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 })
źródło