События касания Android IME всегда ограничены размерами окна.

В настоящее время разрабатывается приложение IME (InputMethodEditor), поэтому существует подкласс InputMethodService, который расширяет представление клавиатуры. В этом случае это просто раздувание представления, его размер аналогичен любому другому клавиатурному приложению. Представление регистрирует позицию сенсорного события для действий вниз, перемещение и вверх. Я свел его к этому, потому что я проверяю позицию касания, заданную в событиях перемещения. Все положения регистрируются относительно окна IME, но когда жест перемещения выходит за пределы вида (над ним), координаты y не продолжаются и остаются равными нулю.

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

РЕДАКТИРОВАТЬ: цель состояла в том, чтобы проверить, может ли событие перемещения действия из представления в окне IME быть передано представлению в другом окне (т. е. плавно продолжить перемещение действия из окна IME в другое), а также вернуться к окно ИМЭ. Но поскольку координаты перемещения кажутся привязанными к окну IME, это не работает, когда событие касания выходит за пределы окна IME.


person bluewhale    schedule 17.12.2016    source источник
comment
Попробуйте поместить представление IME внутри представления контейнера, которое соответствует ширине и высоте родителей. убедитесь, что на фоне этого контейнера ничего нет. Теперь, когда вы раздуваете представление. вы получите и IME, и прозрачный фон, чтобы вы могли контролировать то, что находится за клавиатурой, и ваши координаты Y должны показывать что-то отличное от нуля, я думаю. дайте нам знать, если это помогло вам ^.^   -  person MohammedAlSafwan    schedule 17.12.2016
comment
Хотя это дало бы правильные значения y для связанного представления, IME больше не работал бы. IME будет практически полноэкранным, и прикосновения не попадают в представления внизу. Также приложения устанавливают свои размеры относительно IME, и если это принудительно для полноэкранного режима, приложение не будет отображаться.   -  person bluewhale    schedule 17.12.2016
comment
@TK52 На самом деле то, что вы предложили, может сработать, если вы переопределите onComputeInsets() и установите значения для видимой части IME, которую вы хотели.   -  person bluewhale    schedule 22.12.2016


Ответы (1)


По соображениям безопасности это, по-видимому, является ограничивающей характеристикой окна IME, и мы не нашли разумного способа обойти это. Также нет возможности использовать наложение для решения этого ограничения, как указано в этом ответе: https://stackoverflow.com/a/33698077/3678942 , не может разрешить сенсорным событиям проходить через окно.

Один из способов обойти это — использовать тот факт, что значение y равно нулю (т. е. оно достигло самых верхних границ окна IME), и продолжать использовать событие касания и его значения x (которые все еще вычисляются), чтобы обрабатывать любую необходимую обработку.

Наличие представления-кандидата также помогает: окно IME увеличивает свои размеры, чтобы вместить его, даже если оно не отображается, и любое содержимое базовых приложений будет измеряться только для видимого представления ввода.

person bluewhale    schedule 18.12.2016