2015-07-21 3 views
5

У меня есть приложение, которое используется на открытом воздухе, при любых условиях. Они находятся на корне B & N Nook планшеты под управлением Android 2.1. Они имеют оптическое распознавание касания, а не давление, поэтому большая капля дождя на экране может «отключить» устройство, поскольку оно обнаруживается как прессу, а затем все другие нажатия не обнаруживаются.Как обнаружить касание экрана, которое уже существует при создании активности?

Часть первая: в используемой операции я вручную обнаруживаю длинные (10 секунд) экранные пресса, согласующиеся с капельницей, начинающей блокирующее нажатие. Для этого я использую dispatchTouchEvent(), и это нормально.

Часть вторая. Итак, я открываю новое действие и фактически обводлю дождь и говорю пользователю «стереть эту каплю дождя». Новая активность открывается отлично, и я могу успешно рисовать круги в любом месте, где захочу.

Проблема в том, что новое мероприятие не получает никаких сенсорных событий для этого самого первого нажатия ... длинное нажатие, которое еще не остановилось. Не получить «новый» ACTION_DOWN понятно ... Я уже схватил это. Хотя я поднимаю палец, нет и ACTION_UP. После снятие начального нажатия, все работает нормально: я могу коснуться экрана, мгновенно кружок рисуется вокруг пятна, и он будет двигаться, если я перетащу палец, поэтому проблем нет.

Как получить начальная пресса, которая привела меня сюда, которая все еще существует? Это должен быть какой-то опрос API, а не событие, так как я действительно хочу текущее состояние, и я знаю, что событие уже втянуто. Чтобы быть ясным, из события dispatchTouchEvent() выходят NO-события, пока я сначала не вытащу палец с экрана (даже выключение не создает обнаружаемое событие).

(I ) захватить координаты из предыдущей деятельности и передать ее ... но проблема в том, что падение дождя может скользить в течение 10-секундного периода ожидания. И я предпочел бы, чтобы деятельность была автономной в выполняя свою работу.)

ответ

2

Я не уверен, что вы можете (хотя я никогда не пробовал). Я уверен, что события касания будут отменены, как только откроется новое мероприятие.

Подход, который вы можете решить, заключается в том, чтобы либо использовать API-интерфейсы Framgents, либо просто открыть новый вид поверх того, что касается касания.

The View, которое принимает события прикосновения будут продолжать делать это до тех пор, один из этих событий не произошло:

  1. onTouchEvent() Метод возвращает false. Если он вернет false в любой момент, он перестанет принимать события касания вместе. Если вы вернетесь false в действие ACTION_MOVE, вы получите , а не, получите действие ACTION_UP.

  2. Вы получаете ACTION_CANCEL, который означает, что жест закончился. Обычно это означает, что прикосновение оставило границы обзора, но это может быть несколько причин.

  3. Вы получаете ACTION_UP, что означает, что последний трогательный палец поднят из представления.

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

+0

Поскольку я немного продвигаюсь вперед, я понимаю, что недостающее ACTION_UP проблематично. Это мое уведомление о том, что падение было уничтожено. И это не произошло в предыдущем виде. Интересно, существует ли государственная проблема, когда ОС не отправит ACTION_UP без первой отправки ACTION_DOWN. Или, возможно, до того, как я открою эту операцию, мне нужно очистить очередь ввода/события какого-то типа. Могу ли я как-то отправить ACTION_CANCEL в первую активность? – Anders8

+0

Полный жест начинается с ACTION_DOWN и заканчивается ACTION_UP или ACTION_CANCEL (все остальные действия являются необязательными). Вы не будете получать события касания, если вы не получите ACTION_DOWN и не вернете «true», указав, что ваш View хочет обработать это. – DeeV

+0

Когда вы переходите к другому действию, корневой вид изменяется, поэтому старый 'View', который вы касались, исчез. Вы можете * получить ACTION_CANCEL, если это произойдет, но я думаю, что более вероятно, что система просто отключит цепочку событий касания и перестанет отправлять действия. Когда это произойдет, вы не получите сенсорных событий в новой операции, потому что вам нужно снова запустить цепочку с помощью ACTION_DOWN (поэтому он снова начинает работать, когда вы поднимаете палец и отбрасываете его). – DeeV