Android: начальная задержка getX getY

При чтении значений getX() и getY() для серии событий onTouch я обнаружил, что события ACTION_MOVE будут возвращать координаты ACTION_DOWN до тех пор, пока не будет пройден определенный порог расстояния от этих координат. С этого момента всегда будут возвращаться правильные координаты.

Действия по воспроизведению:

  1. Создайте новый проект приложения с действием по умолчанию
  2. Добавьте следующий метод к действию по умолчанию:

    @Override  
    public boolean onTouchEvent(MotionEvent event) {  
        Log.i("getXYDelay", "(x,y)=("+event.getX() + "," + event.getY() + ")");  
        return super.onTouchEvent(event);  
    }  
    
  3. Запустите на устройстве и смотрите logcat, когда вы касаетесь и перетаскиваете

Вы должны увидеть, что при каждом прикосновении и перетаскивании результаты _7 _ / _ 8_ начинают изменяться только после того, как ваш палец перемещается на половину центрирующего метра или около того, и с этого момента он становится точным.

Я понимаю, как это было бы полезно во многих случаях, но это вызывает проблемы в приложении, которое я пишу, поэтому:

  • Можно ли преодолеть эту начальную задержку? Или его можно обойти?
  • Это зависит от устройства?

В идеале я бы хотел отключить его для одного вида поверхности OpenGL.

Примечание:

  • Этого не происходит, когда я использую Samsung Note SPen.
  • То же самое и с getRawX()/getRawY().
  • Этого не происходит на эмуляторе, поэтому, по-видимому, это происходит из-за драйверов сенсорного оборудования.

Обновление: я предполагаю, что это вызвано драйверами оборудования или аналогичным уровнем и, как таковое, находится вне контроля приложения. Я также попытался опубликовать это в группе разработчиков Android, но через несколько недель кажется, что модераторы все еще сидят на моем посте.


person Kev    schedule 02.06.2014    source источник
comment
Может ли это быть связано с ViewConfiguration, в частности с TouchSlop?   -  person pjco    schedule 15.09.2014
comment
Думаю, вы правы, @pjco, спасибо, что дали ему имя! После быстрого поиска кажется, что изменить TouchSlop невозможно, я сделаю более глубокий поиск, когда у меня будет возможность, но я думаю, что этот вопрос является дубликатом других вопросов о модификации TouchSlop. Спасибо.   -  person Kev    schedule 18.09.2014


Ответы (2)


Разница между getX() и getRawX() в том,

getRawX() и getRawY(), которые гарантированно возвращают абсолютные координаты относительно экрана устройства.

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

Кроме того, проблема, с которой вы столкнулись, возникает по следующей причине

Макет содержимого окна происходит после того, как все элементы созданы и добавлены в их родительские представления. Так должно быть, потому что, пока вы не узнаете, какие компоненты содержит представление, что они содержат и т. Д., Вы не сможете расположить его разумным способом.

Значит, у вас задержка.

person Rohit    schedule 09.06.2014
comment
Это не относится к тому, когда представления строятся, так как это происходит после каждого ACTION_DOWN, спустя много времени после построения. (Спасибо за редактирование форматирования) - person Kev; 10.06.2014
comment
@Kev: Задержка, я испытал, я ответил (выделено жирным шрифтом). Тем не менее, вы столкнулись с проблемой, попробуйте опубликовать код того, что вы сделали, мы постараемся разобраться. :) - person Rohit; 11.06.2014

Я нашел обходной путь, и вы можете найти его здесь:

person MaInStReAm    schedule 04.09.2014