Как получить позицию Touch в android?

92

Мне нужно получить положение начала касания (X, Y), положение перемещения касания и конечное положение касания экрана в android.

Alex
источник

Ответы:

170
@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;
}

Эти три случая предназначены для того, чтобы вы могли реагировать на различные типы событий, в этом примере повторное касание, перетаскивание или поднятие пальца.

dbrettschneider
источник
7
Почему вы возвращаете false?
Даниэль Рейханян
1
Возвращаемое значение true будет означать, что событие касания было обработано, и это предотвратило бы распространение события и наоборот.
хаосификатор
27

Дополнительный ответ

Учитывая 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();

Связанный

Suragch
источник
Это работает, однако в моем тестировании представление, к которому добавлен слушатель, не должно охватываться другими представлениями. Чтобы получить абсолютные координаты точки касания на экране, я добавил в качестве базового представления раскладку фрейма, а поверх него - представление со слушателем. Не забудьте, return falseиначе он поглотит прикосновение.
lenooh 06
@lenooh getRawX()и getRawY()должен возвращать абсолютные координаты позиции касания в любом представлении, к которому добавлен слушатель. Но вы правы, если есть другое представление поверх него, которое возвращается true, то нижние представления не будут уведомлены о событиях касания.
Suragch 07
Сурагч: точно. Так как я использую FrameLayout, я установить вид на «matchParent» так getX()и getY()работают нормально (нет необходимости getRawX/Y()).
lenooh 07
@Suragch Есть ли способ записать прикосновение, даже если оно закрыто каким-то другим видом или имеет детей, как кнопки?
vignesh kumar
@vigneshkumar, представления уведомляются о событиях касания снизу вверх (см. ссылку внизу моего ответа), поэтому вы можете записать событие, onInterceptTouchEventа затем вернуться, falseчтобы событие обрабатывалось как обычно.
Suragch
10
@Override
    public boolean onTouch(View v, MotionEvent event) {
       float x = event.getX();
       float y = event.getY();
       return true;
    }
Сефи
источник
0

Вот стиль Колтина, я использую его в своем проекте, и он очень хорошо работает:

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
    })
cjung
источник