Мне нужно получить положение начала касания (X, Y), положение перемещения касания и конечное положение касания экрана в android.
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;
}
Эти три случая предназначены для того, чтобы вы могли реагировать на различные типы событий, в этом примере повторное касание, перетаскивание или поднятие пальца.
Дополнительный ответ
Учитывая
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
чтобы событие обрабатывалось как обычно.@Override public boolean onTouch(View v, MotionEvent event) { float x = event.getX(); float y = event.getY(); return true; }
источник
Вот стиль Колтина, я использую его в своем проекте, и он очень хорошо работает:
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 })
источник