Мне нужно получить положение начала касания (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
})