Android Instrumentation模拟鼠标点击事件

本文详细记录了如何使用Android的Instrumentation类模拟鼠标点击和按钮事件,包括sendCharacterSync、sendKeyDownUpSync、sendPointerSync等函数的使用,并强调了必须通过Message队列发送以及添加权限<uses-permission android:name="android.permission.INJECT_EVENTS" />的重要性。同时,指出了在多视图环境中,事件会被自动分配到最上层的view,需要注意事件触发位置的选取,以避免被其他view截获。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看了几遍网上的博客一直没有 模拟出鼠标点击事件和按钮事件,后来抱着试试态度再重试的时候终于有所斩获。下面把具体的情况记录一下:

首先我们必须了解类 Instrumentation:

Instrumentation发送键盘鼠标事件:Instrumentation提供了丰富的以send开头的函数接口来实现模拟键盘鼠标,如下所述:

sendCharacterSync(int keyCode)           //用于发送指定KeyCode的按键

sendKeyDownUpSync(int key)               //用于发送指定KeyCode的按键

sendPointerSync(MotionEvent event)    //用于模拟Touch

sendStringSync(String text)                  //用于发送字符串

注意:以上函数必须通过Message的形式抛到Message队列中。如果直接进行调用加会导致程序崩溃。









小结:Android instrumentation 只能在当前Acitivity上模拟事件

MotionEvent.ACTION_MOVE

inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, offetX, offetY, 0));
nst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(), MotionEvent.ACTION_MOVE, offetX, offetY, 0));
inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(), MotionEvent.ACTION_UP,   offetX, offetY, 0));


MotionEvent.ACTION_DOWN

inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, offetX, offetY, 0));
inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(), MotionEvent.ACTION_UP,   offetX, offetY, 0));

MotionEvent.ACTION_UP

inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(), MotionEvent.ACTION_UP,   offetX, offetY, 0));

直接这个是不会有MotionEvent.ACTION_UP这个事件的,必须先按下MotionEvent.ACTION_DOWN才会有MotionEvent.ACTION_UP事件产生

Android  各个View之间的消息传递使用dispatchTouchEvent();

 

还得记住在配置文件中添加  <uses-permission android:name="android.permission.INJECT_EVENTS" />这个权限。如果你想讲你的鼠标事件作用到另外一个应用程式那么你需要在另外一个应用程式的配置文件中也加上这个权限,否则将报错。 这里使用上面进行模拟鼠标事件时一定记得try{} catch()避免程式崩溃。

还要注意一点的是这个事件被自动分配到最上层的view上,因此如果你要模拟一个鼠标的话出发的点必须保证不会落在你绘制的图标view上面,否则事件会被突变view截获。


 




评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值