MotionEvent GetY() и getX() возвращают неверные значения

У меня следующая ситуация:

У меня есть собственный ListView с ImageView и TextView подряд. ImageView имеет onTouchListener, который вызывает мой метод onTouch. Вот несколько строк из него:

if (event.getAction()==MotionEvent.ACTION_MOVE) {
    layout.leftMargin = (int) event.getX() - dragIcon.getWidth()/2;         
    layout.topMargin = (int) event.getY() - dragIcon.getHeight()/2;
    //Log.d("Tag", "Pozycja: " +  event.getX() +", "+  event.getY());
}
dragIcon.setLayoutParams(layout);

При обнаружении движения я показываю новое изображение (не это в ListView) и начинаю перемещать его в соответствии с координатами x и y.

Проблема в том, что getX и getY возвращают позиции относительно ImageView в списке, а не всего ListView (я так думаю). Поэтому, когда я касаюсь элемента посередине и провожу пальцем вверх, getY возвращает отрицательные значения (выше границы ImageView).

Надежда, понятно объяснила..

Любые идеи, как получить эти координаты относительно размера экрана? Спасибо.


person glodos    schedule 04.06.2011    source источник
comment
См. также Разницу между MotionEvent.getRawX и MotionEvent.getX   -  person Suragch    schedule 20.09.2016


Ответы (3)


Попробуйте использовать getRawX() и getRawY() вместо getX() и getY().

person Kevin Coppock    schedule 04.06.2011
comment
в моем случае и y, и rawY неверны для отмены события движения в onTouchListener в ViewHolder в recycleview с простым выбором. - person coolcool1994; 13.06.2020

getX() и getY() возвращают значения, соответствующие представлениям, для которых они были вызваны. Следовательно, скажем,

ImageView imV = (ImageView)findViewById(R.id.image_view);

Затем вы можете получить x, y, используя

x = imV.getX() + event.getX();
y = imV.getY() + event.getY();

Здесь я предполагаю, что вы установили onTouchListener на imV.

person Debanjan    schedule 06.04.2017
comment
Вы спасли меня. Это прекрасно работает. getRawX(), getRawY() мне не помогли. - person grenzfrequence; 26.10.2018

Вот полный ответ. Это фиксирует последние 3 события во временной переменной: https://stackoverflow.com/a/54438485/1931228

person Pier Betos    schedule 30.01.2019