Как выполнить масштабирование в игре с помощью ADB через USB для Android

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

Решение возможности, которые я пробовал: запись событий и их воспроизведение, но это происходит очень медленно через оболочку ADB (например, этот GitHub).

Это оставляет меня с моим последним вопросом: как кто-то может увеличить/уменьшить масштаб с помощью инструмента/библиотеки, используя Python?


person bhappy    schedule 20.12.2020    source источник


Ответы (1)


Первый вариант

uiautomator от xiaocong. Эта библиотека специально поддерживает два точечных жеста — см. примеры, взятые из репозитория GitHub:

d(text="Settings").gesture((sx1, sy1), (sx2, sy2)) \
              .to((ex1, ey1), (ex2, ey2))

Переход от одной точки к другой с помощью двух точек.

Самое главное, есть специальные функции pinch.in() и pinch.out(). Видеть:

d(text="Settings").pinch.In(percent=100, steps=10)
d(text="Settings").pinch.Out()

Я могу настоятельно рекомендовать эту оболочку Python из-за ее подробной документации, а также функциональности.

Прежде всего, установите uiautomator library:

pip install uiautomator

Небольшой фрагмент кода, который я использовал для тестирования (это работает только для Android 4.3 и далее; pinch нельзя установить до Android 4.3):

from uiautomator import device as d

#Replace the variables, marked by the percentage signs 
d = Device('%serial_number%', adb_server_host='%server%', adb_server_port=%port%)

#[...]

#Zooming in - arbitrary example values for a "small zoom" in; from the edges to the center
d(text="Settings").pinch.In(percent=30, steps=10)

На этом этапе я хочу упомянуть примечание из репозитория GitHub относительно %server%:

Хотя adb поддерживает параметр -a начиная с SDK 4.3, но теперь в нем есть ошибка. Единственный способ запустить прослушивание сервера adb на всех интерфейсах вместо локального хоста — это adb -a -P 5037 fork-server server &

Для дальнейшего чтения по этой теме я настоятельно рекомендую задать вопрос из Android Stackexchange (https://android.stackexchange.com/questions/52911/adb-start-server-and-listen-on-all-интерфейсы).


Второй вариант

Проводя исследование, я нашел еще один вопрос StackOverflow, который тесно связан с вашим сообщением: Запустить команду ввода/вывода на телефон Android с помощью adb. Несмотря на то, что эта ветка не предназначена специально для Python, я настоятельно рекомендую взглянуть на нее. Пользователь @Saurabh Meshram подробно описал, как использовать getevent и sendevent для достижения защемления. движение через adb. (Дополнительные источники: см. также этот сообщение в блоге)

Хотя, если я правильно понял ваш первоначальный вопрос, вы уже пробовали этот подход:

Я пробовал записывать события

Тем не менее, для полноты картины следует упомянуть второй вариант. Итак, перейдем к третьему варианту:


Третий вариант

Здесь приходит хитрое решение. python_api для репозиторий android_touch не поддерживает действие сжатия и масштабирования как таковое. Хотя с TouchActionBuilder вам разрешено создавать сложные действия, такие как масштабирование и масштабирование.

В зависимости от движения, которое вы хотите получить, вы можете комбинировать вариант down() или multidown() с параметрами move() и multimove(). Для этого я настоятельно рекомендую взглянуть на код а также пример сложного действия.


Дополнительная литература и источники

person J. M. Arnold    schedule 23.12.2020