如何通过 Android 的 USB 使用 ADB 对游戏执行“捏缩放”

bha*_*ppy -2 python android adb python-3.x pinchzoom

我正在开发一些需要使用捏合缩放功能的游戏的自动化(有关多点触控手势的更多信息,请参阅这篇维基百科文章)。

我尝试过的解决方案可能性:记录事件并重播它们,但是通过 ADB Shell(例如这个 GitHub)执行速度非常慢。

这给我留下了最后一个问题:如何使用 Python 通过工具/库执行捏合放大/缩小?

J. *_*old 5

第一个选项

的uiautomator。该库特别支持两点手势 - 请参阅来自 GitHub 存储库的示例:

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

用两点从一个点移动到另一个点。

最重要的是有一个特定的pinch.in()pinch.out()功能。看:

d(text="Settings").pinch.In(percent=100, steps=10)
d(text="Settings").pinch.Out()
Run Code Online (Sandbox Code Playgroud)

强烈推荐这个 python 包装器,因为它有详细的文档和功能。

首先,安装uiautomator library

pip install uiautomator
Run Code Online (Sandbox Code Playgroud)

我用于测试的小代码片段(这仅适用于 Android 4.3 和正在进行的;“直到 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)
Run Code Online (Sandbox Code Playgroud)

在这一点上,我想提一下 GitHub 存储库中关于%server%以下内容的注释:

虽然adb-a从SDK 4.3 开始支持option,但是现在它有一个bug。在所有接口而不是 localhost 上启动 adb 服务器侦听的唯一方法是adb -a -P 5037 fork-server server &

为了进一步阅读这个主题,我强烈建议从 Android Stackexchange 提出一个问题(https://android.stackexchange.com/questions/52911/adb-start-server-and-listen-on-all-interfaces)。


第二种选择

在做我的研究时,我发现了另一个与您的帖子高度相关的 StackOverflow 问题:使用 adb 向 Android 手机发出捏入/捏出命令- 尽管该线程不是专门针对 Python 的,但我强烈建议您查看一下. 用户@Saurabh Meshram详细描述了如何使用getevent以及如何sendevent通过 adb 实现捏合/捏合运动。(更多来源:也请查看这篇博文

虽然如果我理解你最初的问题是正确的,你已经尝试过这种方法:

我试过记录事件

仍然为了完整起见,应该提到第二个选项。无论如何,转到第三个选项:


第三个选项

这里有一个“棘手”的解决方案。该python_api的的android_touch回购 并不特别支持本身捏和缩放操作。尽管使用 ,TouchActionBuilder您可以构建复杂的操作作为捏和缩放。

根据您想要的动作,您可以将down()multidown()选项与move()和结合使用multimove()。为了实现这一点,我强烈建议查看代码以及“复杂操作”的示例。


进一步阅读和来源