У меня проблема с реализацией сенсорных событий на GLSurfaceView
. Размер просмотра составляет 1280x696 из-за строки состояния Android (планшета) внизу с программными клавишами, временем и т. д. (разрешение экрана 1280x800), но OnTouchListener
получает сенсорные события с координатами [646.0,739.0], и, таким образом, мой метод gluunproject не возвращает правильные значения. Есть ли способ вернуть события, соответствующие этим границам? или как мне пересчитать позицию?
Как получить правильные значения из сенсорного события Views
Ответы (1)
В общем, для перехода между такими системами координат: Если вы переходите из системы A в B и у вас есть точки
- AOrigin (левый верхний угол вашего ресивера)
- AEnd (правый нижний угол вашего приемника (исходное положение + размер))
- BOrigin (левый верхний угол вашего представления GL)
- BEnd (правый нижний угол вашего представления GL (происхождение + размер))
где AOrigin и BOrigin представляют одно и то же местоположение в поле зрения, и то же самое относится к AEnd и BEnd, а затем к точке P в представлении приемника:
X = B.Origin.x + ((P.x - AOrigin.x)/(AEnd.x - AOrigin.x)) * (BEnd.x - B.Origin.x)
Y = B.Origin.y + ((P.y - AOrigin.y)/(AEnd.y - AOrigin.y)) * (BEnd.y - B.Origin.y)
Для вашего случая (я не уверен из-за отсутствия информации) AOrigin находится в (0,0), AEnd в (646, 739), BOrigin в (0,0) и BEnd в (1280, 800) :
X = P.x/646 * 1280
Y = P.y/739 * 800
Вы также можете использовать это для перехода в/из координат "GL". Распространенным случаем является представление с верхним левым углом в (0, 0) и нижним нижним в (1280, 800), а ваши координаты «GL» от (-1, 1) до (1, -1):
X = -1 + (P.x/1280)*2
Y = 1 + (P.y/800)*(-2)
Также обратите внимание, что вы можете использовать любые 2 пары точек, которые представляют одно и то же место на экране, если (origin-end).x != 0
И (origin-end).y != 0