Мені потрібно отримати початкове положення дотику (X, Y), положення переміщення та торкання кінця екрана в android.
Відповіді:
@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;
}
У трьох випадках ви можете реагувати на різні типи подій, у цьому прикладі постукування, перетягування або підняття пальця знову.
Враховуючи 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;
}
};
встановити на деякий вигляд:
myView.setOnTouchListener(handleTouch);
Це дає вам координати події дотику щодо подання, для якого призначений прослуховувач дотику. У верхньому лівому куті огляду є (0, 0). Якщо yпровести пальцем над видом, це буде негатив. Якщо рухати пальцем ліворуч від подання, xце буде негативним.
int x = (int)event.getX();
int y = (int)event.getY();
Якщо вам потрібні координати відносно верхнього лівого кута екрана пристрою, використовуйте вихідні значення.
int x = (int)event.getRawX();
int y = (int)event.getRawY();
return falseінакше він поглине дотик.
getRawX()і getRawY()повинен повертати абсолютні координати положення дотику на будь-якому поданні, до якого додається слухач. Але ви маєте рацію, якщо поверх нього є інший вигляд, який повертається true, тоді про нижчі види не повідомлятимуться про події дотику.
getX()і getY()працюють нормально (немає необхідності getRawX/Y()).
onInterceptTouchEventа потім повернутись, falseщоб подія оброблялася як зазвичай.
Ось стиль Колтіна, я використовую це у своєму проекті, і він працює дуже добре:
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
})