【问题标题】:How to simulate a touch event in Android?如何在 Android 中模拟触摸事件?
【发布时间】:2010-12-09 07:59:25
【问题描述】:

如何在手动给出 X 和 Y 坐标的同时使用 Android 模拟触摸事件?

【问题讨论】:

  • 您在下面得到了一些可行的答案,请记住它们仅适用于您可以进行小幅修改的应用程序。对于您无法修改的其他应用,您需要一个根平台来注入事件。
  • 是否可以让应用程序每 10 秒触摸 x,y 并将其最小化,但继续触摸 x,y?
  • 检查我的答案,没有根要求。 :)

标签: android adb gesture-recognition


【解决方案1】:

如果您扩展了视图,Valentin Rocher 的方法可以工作,但如果您使用事件侦听器,请使用:

view.setOnTouchListener(new OnTouchListener()
{
    public boolean onTouch(View v, MotionEvent event)
    {
        Toast toast = Toast.makeText(
            getApplicationContext(), 
            "View touched", 
            Toast.LENGTH_LONG
        );
        toast.show();

        return true;
    }
});


// Obtain MotionEvent object
long downTime = SystemClock.uptimeMillis();
long eventTime = SystemClock.uptimeMillis() + 100;
float x = 0.0f;
float y = 0.0f;
// List of meta states found here: developer.android.com/reference/android/view/KeyEvent.html#getMetaState()
int metaState = 0;
MotionEvent motionEvent = MotionEvent.obtain(
    downTime, 
    eventTime, 
    MotionEvent.ACTION_UP, 
    x, 
    y, 
    metaState
);

// Dispatch touch event to view
view.dispatchTouchEvent(motionEvent);

有关获取 MotionEvent 对象的更多信息,这是一个很好的答案:Android: How to create a MotionEvent?

【讨论】:

  • 很好的答案,但作为 Android 初学者,OnTouchListener 让我感到困惑。我现在意识到监听器不是模拟所必需的。唯一需要的是代码后半部分中的 MotionEvent。
  • 为什么要给 eventTime 添加 100 毫秒?如果downTime和eventTime相同,是不是不行?
  • @tudor - 仅用于模拟真实的触摸。 downTime 是用户触摸屏幕的时间,而eventTime 在这种情况下是用户抬起手指的时间 (ACTION_UP)。如果两者相同,我不确定它是否仍然有效。您可以对其进行测试并发布您的结果。
  • 我应该如何声明视图对象?
  • ok.. 左右滑动手势怎么样.. 使用 ACTION_MOVE 怎么做?
【解决方案2】:

这是一个将触摸和拖动发送到应用程序的 monkeyrunner 脚本。我一直在使用它来测试我的应用程序是否可以处理快速重复的滑动手势。

# This is a monkeyrunner jython script that opens a connection to an Android
# device and continually sends a stream of swipe and touch gestures.
#
# See http://developer.android.com/guide/developing/tools/monkeyrunner_concepts.html
#
# usage: monkeyrunner swipe_monkey.py
#

# Imports the monkeyrunner modules used by this program
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice

# Connects to the current device
device = MonkeyRunner.waitForConnection()

# A swipe left from (x1, y) to (x2, y) in 2 steps
y = 400
x1 = 100
x2 = 300
start = (x1, y)
end = (x2, y)
duration = 0.2
steps = 2
pause = 0.2

for i in range(1, 250):
    # Every so often inject a touch to spice things up!
    if i % 9 == 0:
        device.touch(x2, y, 'DOWN_AND_UP')
        MonkeyRunner.sleep(pause)
    # Swipe right
    device.drag(start, end, duration, steps)
    MonkeyRunner.sleep(pause)
    # Swipe left
    device.drag(end, start, duration, steps)
    MonkeyRunner.sleep(pause)

【讨论】:

  • 您应该使用MonkeyDevice.DOWN_AND_UP 而不是'DOWN_AND_UP'。 (DOWN_AND_UP 是默认值,因此您的代码仍然有效)
  • 在另一台设备 (Nexus 10) 上尝试过,它只是在 UP 操作后重新启动
  • 我可以在非测试类中使用它吗?
【解决方案3】:

使用 adb Shell 命令模拟触摸事件

adb shell input tap x y 

and also 

adb shell sendevent /dev/input/event0 3 0 5 
adb shell sendevent /dev/input/event0 3 1 29 

【讨论】:

  • 嘿,如果想使用 adb 命令模拟缩放缩放,我有缩放缩放坐标
【解决方案4】:

如果我理解清楚,您想以编程方式执行此操作。然后,您可以使用ViewonTouchEvent 方法,并使用您需要的坐标创建一个MotionEvent

【讨论】:

    【解决方案5】:

    你应该试试新的monkeyrunner。也许这可以解决你的问题。你把keycode放进去测试,也许触摸事件也是可能的。

    【讨论】:

    • 请告诉我如何安装monkeyrunner。 adb 无法识别monkeyrunner
    • 与 adb 的 ui excersiser monkey 无关。您会在 adt 修订版 9 的 tools 目录中找到 monkeyrunner。
    • 还可以查看我在答案中提供的链接。这导致 Google 提供了有关 monkeyrunner 的信息。
    • 我试过“./adb shell monkey”。但无法调用触摸事件
    • 不是adb shell monkey,而是monkeyrunner,这是一个不同的工具。
    【解决方案6】:

    在使用 Monkey Script 时,我注意到 DispatchPress(KEYCODE_BACK) 什么都不做,真的很糟糕。在许多情况下,这是因为 Activity 不使用 Key 事件。 这个问题的解决方案是混合使用猴子脚本和 adb shell 按顺序输入命令。

    1 使用猴子脚本给了一些很好的时机 控制。为活动等待一定的秒数并且是 阻止 adb 调用。
    2 最后发送 adb shell input keyevent 4 将结束正在运行的APK。

    EG

    adb shell monkey -p com.my.application -v -v -v -f /sdcard/monkey_script.txt 1
    adb shell 输入keyevent 4

    【讨论】:

    • 欢迎来到 Stack Overflow!感谢您发布您的答案!请务必仔细阅读FAQ on Self-Promotion。另请注意,每次链接到您自己的网站/产品时,都要求发布免责声明。我已经删除了链接。不要在没有添加披露的情况下重新添加它。
    【解决方案7】:

    MotionEvent 仅通过触摸屏幕生成。

    【讨论】:

    • 您可以使用 MotionEvent 的静态获取方法之一手动创建一个。
    猜你喜欢
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多