У меня есть приложение, которое используется на открытом воздухе, при любых условиях. Они находятся на корне B & N Nook планшеты под управлением Android 2.1. Они имеют оптическое распознавание касания, а не давление, поэтому большая капля дождя на экране может «отключить» устройство, поскольку оно обнаруживается как прессу, а затем все другие нажатия не обнаруживаются.Как обнаружить касание экрана, которое уже существует при создании активности?
Часть первая: в используемой операции я вручную обнаруживаю длинные (10 секунд) экранные пресса, согласующиеся с капельницей, начинающей блокирующее нажатие. Для этого я использую dispatchTouchEvent(), и это нормально.
Часть вторая. Итак, я открываю новое действие и фактически обводлю дождь и говорю пользователю «стереть эту каплю дождя». Новая активность открывается отлично, и я могу успешно рисовать круги в любом месте, где захочу.
Проблема в том, что новое мероприятие не получает никаких сенсорных событий для этого самого первого нажатия ... длинное нажатие, которое еще не остановилось. Не получить «новый» ACTION_DOWN понятно ... Я уже схватил это. Хотя я поднимаю палец, нет и ACTION_UP. После снятие начального нажатия, все работает нормально: я могу коснуться экрана, мгновенно кружок рисуется вокруг пятна, и он будет двигаться, если я перетащу палец, поэтому проблем нет.
Как получить начальная пресса, которая привела меня сюда, которая все еще существует? Это должен быть какой-то опрос API, а не событие, так как я действительно хочу текущее состояние, и я знаю, что событие уже втянуто. Чтобы быть ясным, из события dispatchTouchEvent() выходят NO-события, пока я сначала не вытащу палец с экрана (даже выключение не создает обнаружаемое событие).
(I ) захватить координаты из предыдущей деятельности и передать ее ... но проблема в том, что падение дождя может скользить в течение 10-секундного периода ожидания. И я предпочел бы, чтобы деятельность была автономной в выполняя свою работу.)
Поскольку я немного продвигаюсь вперед, я понимаю, что недостающее ACTION_UP проблематично. Это мое уведомление о том, что падение было уничтожено. И это не произошло в предыдущем виде. Интересно, существует ли государственная проблема, когда ОС не отправит ACTION_UP без первой отправки ACTION_DOWN. Или, возможно, до того, как я открою эту операцию, мне нужно очистить очередь ввода/события какого-то типа. Могу ли я как-то отправить ACTION_CANCEL в первую активность? – Anders8
Полный жест начинается с ACTION_DOWN и заканчивается ACTION_UP или ACTION_CANCEL (все остальные действия являются необязательными). Вы не будете получать события касания, если вы не получите ACTION_DOWN и не вернете «true», указав, что ваш View хочет обработать это. – DeeV
Когда вы переходите к другому действию, корневой вид изменяется, поэтому старый 'View', который вы касались, исчез. Вы можете * получить ACTION_CANCEL, если это произойдет, но я думаю, что более вероятно, что система просто отключит цепочку событий касания и перестанет отправлять действия. Когда это произойдет, вы не получите сенсорных событий в новой операции, потому что вам нужно снова запустить цепочку с помощью ACTION_DOWN (поэтому он снова начинает работать, когда вы поднимаете палец и отбрасываете его). – DeeV