Управлять всеми событиями мыши в Android
Ну, вопрос довольно прост - как я могу управлять левым/правым/средним кликом, колесом и (!) движением hover в android 2/3/4.
Я раскалывал эту тему и нашел следующее
- в api 14 мы можем обрабатывать практически все, что угодно, с новым мотивом MotionEvent
- У нас также есть открытый аксессуар, который, кажется, в порядке с USB-мышью, поскольку api 12 (все еще отсутствует Bluetooth) (UPD OA backported to 2.3.4)
- Мышь действительно хорошо работает на планшетах с ICS, Honeycomb и cyanogen 2.3.7, но действует как одно касание на каждой кнопке. Интересно, есть ли способ перехватить сообщения мыши.
Помогите мне понять, как я могу обращаться с Bluetooth и usb-мышью самым простым и правильным способом в каждой версии Android. Или сказать, что это невозможно.
UPD2: кажется, что USB Host только в версии 3.1+, а USB-аксессуар бесполезен для этой задачи
Ответы
Ответ 1
Вот мои выводы:
Для уровня Api < 9:
- Внешняя основная кнопка мыши обрабатывается так же, как и обычное касание пальца. Кажется, что нет способа обнаружить мышь.
- Вторичная кнопка отправляется через
KeyEvent
с помощью KeyEvent.KEYCODE_BACK
. Невозможно провести различие между фактическими нажатиями "Назад" и дополнительными нажатиями кнопок.
Для уровня Api 9 +:
- Добавлен новый метод
MotionEvent.getSource()
. Я использую это, чтобы определить, находится ли вход от мыши.
- Вторичная кнопка по-прежнему отправляется через
KeyEvent
с помощью KeyEvent.KEYCODE_BACK
. На некоторых устройствах KeyEvent.getSource()
возвращает InputDevice.SOURCE_MOUSE
, поэтому в некоторых случаях работает вторичное обнаружение кнопок.
Для Api Level 12 +:
-
Добавлен
-
OnGenericMotionListener
. Я использую это для обнаружения движений мыши с помощью ACTION_HOVER_MOVE
и изменения колес с помощью ACTION_SCROLL
.
Для Api Level 14 +:
- Новый метод
MotionEvent.getButtonState()
. Я отслеживаю это, чтобы отличить, нажата ли первичная, вторичная, третичная кнопка мыши, когда MotionEvent.getActionMasked()
- ACTION_MOVE
, ACTION_DOWN
или ACTION_UP
.
Я не изучал Api Level 15/16 или тип инструмента, потому что я могу отслеживать все события мыши с тем, что я описал выше. Было бы интересно, если у кого-то есть дополнительная информация или если я пропущу 15/16/типы инструментов.
Ответ 2
OK. Кажется, я понял.
Я прочитал основные сведения об андроиде 3.x/4.x и понял, что...
-
мы можем использовать мышь в android 3+, в более старых версиях мышь специфична для устройства
-
мы можем перехватывать распознанные события мыши из любого источника (BT или USB)...
2,1.... прокрутка или hover_move в 3.1+ в onGenericMotionEvent
2,2.... первичные, вторичные и третичные кнопки и наведите указатель на вход/оставить в android 4.0+ (и, наконец, константу TOOL_TYPE_MOUSE)
Другой вариант - разобрать довольно низкоуровневые данные из сокета bluetooth или usb в режиме хоста.
Я прав? Все еще интересно, есть ли у кого-нибудь лучшее решение.