Когда прикосновения начинают становиться прикосновениями? - PullRequest
14 голосов
/ 14 июля 2009

Когда вы проводите пальцем по сенсорному экрану iPhone, он генерирует touchesMoved событий с хорошей частотой 60 Гц.

Однако переход от начального события touchesBegan к первому touchesMoved менее очевиден: иногда устройство ждет некоторое время.

Чего это ждет? Чем больше время / расстояние? Еще прикосновения к событию?

Кто-нибудь знает?

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

Чтобы увидеть этот баг / явление в действии

  1. медленно перетащите ползунок разблокировки экрана iPhone вправо. обратите внимание на внезапный скачок и обратите внимание на то, как это происходит, если на экране в другом месте лежит другой палец

  2. попробуйте "ползти" по узкому мосту в любом количестве 3D-игр. Срыв!

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

8 месяцев назад надо было регистрировать это как ошибку.

Ответы [ 5 ]

4 голосов
/ 16 июля 2009

После запуска события touchesBegan UIKit ищет позиционное движение касания пальца, которое преобразуется в события touchedMoved, когда x / y пальца изменяется до тех пор, пока палец не будет поднят и событие touchesEnded запущено.

Если палец удерживать в одном месте, он не будет вызывать событие touchesMoved, пока не произойдет движение.

Я создаю приложение, в котором вы должны рисовать, основываясь на TouchSMoved, и это происходит через определенные промежутки времени, но оно достаточно быстрое, чтобы создать плавный рисунок. Поскольку это событие, которое похоронено в SDK, вам, возможно, придется провести некоторое тестирование в своем сценарии, чтобы увидеть, насколько быстро он реагирует, в зависимости от других действий или событий он может изменяться в зависимости от используемой ситуации. По моему опыту, это в течение нескольких мс движения, и это примерно с 2-3k других спрайтов на экране.

Рисование начинается с события touchesBegan, хотя первое размещение устанавливается, затем оно цепляется к touhesMoved и заканчивается на touchesEnd. Я использую все события для операции перетаскивания, так что, возможно, в этом случае начальное движение менее запаздывает в восприятии.

Чтобы протестировать в своем приложении, вы можете поставить отметку времени для каждого события, если это имеет решающее значение для вашего дизайна, и выработать какое-то смягчение.

http://developer.apple.com/IPhone/library/documentation/UIKit/Reference/UIResponder_Class/Reference/Reference.html#//apple_ref/occ/instm/UIResponder/touchesMoved:withEvent:

2 голосов
/ 05 января 2012

Я не думаю, что это ошибка, это скорее отсутствующая функция.

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

В этом нет ничего нового, он всегда был там, например, есть несколько пикселей допуска для двойных щелчков в GUI на основе указателей - или даже тот же самый допуск до начала перетаскивания, потому что пользователи иногда непреднамеренно перетаскивают, когда они просто хотел щелкнуть. Попробуйте медленно переместить элемент на рабочий стол (OSX или Windows), чтобы увидеть его.

Отсутствует функция, которую нельзя настроить.

Идея: возможно ли ввести временную петлю на touchesBegan, которая периодически проверяет locationInView: касания

1 голос
/ 20 июля 2009

Я не представляю никакого официального ответа, но имеет смысл, что touchesBegan-> touchesMoved имеет более длительную продолжительность, чем touchesMoved-> touchesMoved. Разработчикам было бы неприятно, если бы каждое прикосновение Бегана сопровождалось кучей случайных событий прикосновения. Apple, должно быть, определила (экспериментально) некоторое расстояние, на котором прикосновение становится сопротивлением. После того, как штриховые движения начались, больше нет необходимости выполнять этот тест, потому что каждая точка до следующего касания гарантированно будет перемещена.

Похоже, это то, что вы говорите в своем первоначальном посте, Ритмик Фистман, и я просто хотел немного подробнее остановиться и сказать, что я согласен с вашими рассуждениями. Это означает, что если вы вычисляете «скорость перетаскивания» некоторого вида, вы должны использовать пройденное расстояние как фактор, а не в зависимости от частоты таймера обновления (что в любом случае лучше).

0 голосов
/ 25 января 2011

В настоящее время такая «задержка» между касаниями Began и touchesMoved присутствует и тогда, когда другие пальцы касаются экрана. К сожалению, кажется, что возможность отключить его еще не существует. Я также являюсь разработчиком музыкальных приложений (и плеером), и это поведение меня очень раздражает.

0 голосов
/ 16 июля 2009

Его ждет первый ход. Вот как ОС отличает перетаскивание от крана. После того, как вы перетащите, все новые уведомления будут перемещены.

Это также причина, по которой вы должны написать код для выполнения при событии касания.

...