如何在Android中模拟触摸事件?


101

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


1
您会在下面得到一些可行的答案,请记住,它们仅适用于您可以对其进行少量修改的应用程序。对于您无法修改的其他应用,您需要一个有根的平台来注入事件。
克里斯·斯特拉顿

是否可以使应用程序每10秒触摸一次x,y并将其最小化,但继续触摸x,y?
Dr.jacky

检查我的答案,没有根本的要求。:)
Anand Varkey Philips飞利浦

Answers:


110

如果您扩展了视图,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:如何创建MotionEvent?


1
很好的答案,但是作为Android初学者,OnTouchListener使我感到困惑。我现在意识到,监听程序对于模拟不是必需的。唯一必要的是代码后半部分的MotionEvent。
user1532390

为什么要在eventTime中添加100毫秒?如果downTime和eventTime相同,那不起作用吗?
tu-Restate Monica-dor duh 2014年

2
@tudor-仅用于模拟真实感。downTime将是用户在屏幕上向下触摸的时间,而eventTime在这种情况下将是用户将手指抬起(ACTION_UP)的时间。我不确定如果两者相同,是否仍然可以使用。您可以对其进行测试并发布结果。
阿兹德夫2014年

我应该如何声明视图对象?
TheLogicGuy

好的..如何左右,左右滑动手势呢?使用ACTION_MOVE怎么做?
Ramesh_D

24

这是一个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)

1
您应该使用MonkeyDevice.DOWN_AND_UP而不是'DOWN_AND_UP'。(这DOWN_AND_UP是默认设置,因此您的代码仍然有效)
ValarDohaeris

在另一台设备(Nexus 10)上尝试过后,它仅在UP操作后
立即

我可以在非测试课程中使用它吗?
丹尼亚(Dania)

20

使用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 

1
嘿,如果要使用adb命令模拟捏缩放,我有捏缩放的坐标
nikhil84


1

你应该给新的monkeyrunner试一下。也许这可以解决您的问题。您将密钥代码放入其中进行测试,也许触摸事件也是可能的。


1
请让我知道如何安装monkeyrunner。亚行无法识别
Monkeyrunner

它与adb的ui激励器猴子无关。您可以在adt修订版9的工具目录中找到Monkeyrunner。
keyboardsurfer 2010年

还要检查我在答案中提供的链接。这导致Google在Monkeyrunner上提供了信息。
keyboardsurfer 2010年

我尝试使用“ ./adb壳猴”。但是无法调用触摸事件
印第安那

它是不是adb shell monkey这是monkeyrunner,这是一个不同的工具。
keyboardsurfer 2010年

0

使用Monkey Script时,我注意到DispatchPress(KEYCODE_BACK)并没有做任何真正令人讨厌的事情。在许多情况下,这是由于Activity不使用Key事件。解决此问题的方法是在序列中混合使用猴子脚本和adb shell输入命令。

1使用猴子脚本可以很好地控制时间。等待该活动一定时间,这是一个阻塞的adb调用。
2最终发送adb shell输入keyevent 4将结束正在运行的APK。

例如

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


欢迎使用Stack Overflow!感谢您发布答案!请务必仔细阅读有关自我促销常见问题解答。另请注意,每次链接到您自己的站点/产品,您都必须发布免责声明。我已删除链接。也不要在未添加披露的情况下将其重新添加。
Andrew Barber 2013年

-6

仅通过触摸屏幕即可生成MotionEvent。


10
您可以使用MotionEvent的静态获取方法之一手动创建一个。
azdev 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.