模拟Android多点触控

本文介绍了在Android模拟器上实现多点触控的两种方法:通过adb shell input命令和adb shell sendevent命令。第一种方法由于阻塞式调用无法实现真正多点触控,第二种方法通过解析和模拟事件可以实现多点操作,例如双指滑动和缩放。
AI助手已提取文章相关产品:

Android多点触控

多点触控实现思路

  经过资料的查询,要在Android模拟器上实现多点触控,滑动等操作,主要有两种思路:

  • 一是通过adb shell input swipe 来模拟手指滑动,实现多点触控;
  • 二是先通过adb shell getevent来获取用户多点触控事件的event,进行解析之后,用adb shell sendevent 来模拟用户的操作;

第一种adb shell input方式

  对第一种方法进行试验,发现adb shell input 命令是阻塞式调用的,第一条命令开始执行后,等到命令执行完后返回,第二条命令才开始执行,比如,我们用两条adb命令:

adb shell input swipe 100 100 300 300 1000
adb shell input swipe 200 200 100 100 800

  则展示出来的结果是,用户先在坐标100 100到300 300上进行了一次1000ms的滑动,之后又在200 200到100 100上进行了一次800ms的滑动,因此,第一种方式不能很好地模拟多点触控方式。

第二种adb shell sendevent方式

  之后开始对第二种思路进行试验,这里采用的环境是Genymotion 2.5.2下的Android 4.2.2版本的nexus 4虚拟机。
  首先我们要用adb shell getevent来对目标虚拟机进行事件监听。在genymotion中,所有操作都被封装在 /dev/input/event7中,然后我对事件进行了解析,部分结果如下:

//按下
/dev/input/event7: 0001 014a 00000001
/dev/input/event7: 0003 003a 00000001
/dev/input/event7: 0003 0035 00000122
/dev/input/event7: 0003 0036 000001d5
/dev/input/event7: 0000 0002 00000000
/dev/input/event7: 0000 0000 00000000

//松开
/dev/input/event7: 0001 014a 00000000
/dev/input/event7: 0003 003a 00000000
/dev/input/event7: 0003 0035 00000122
/dev/input/event7: 0003 0036 000001d5
/dev/input/event7: 0000 0002 00000000
/dev/input/event7: 0000 0000 00000000

//滑动过程中
/dev/input/event7: 0003 0035 00000225
/dev/input/event7: 0003 0036 000003ba
/dev/input/event7: 0000 0002 00000000
/dev/input/event7: 0000 0000 00000000

/dev/input/event7: 0003 0035 00000225
/dev/input/event7: 0003 0036 000003bb
/dev/input/event7: 0000 0002 00000000
/dev/input/event7: 0000 0000 00000000

//松开
/dev/input/event7: 0001 014a 00000000
/dev/input/event7: 0003 003a 00000000
/dev/input/event7: 0003 0035 00000225
/dev/input/event7: 0003 0036 000003bb
/dev/input/event7: 0000 0002 00000000
/dev/input/event7: 0000 0000 00000000

//模拟双指缩放
//genymotion在mac下是通过摁下control然后拖动鼠标来模拟向外滑动,向内滑动等操作,用sendevent可以不用加上control的操作
//摁下control
/dev/input/event7: 0001 007d 00000001
/dev/input/event7: 0000 0000 00000000

//鼠标左键摁下
/dev/input/event7: 0001 014a 00000001
/dev/input/event7: 0003 003a 00000001

//一组
/dev/input/event7: 0003 0035 00000144
/dev/input/event7: 0003 0036 00000280
/dev/input/event7: 0000 0002 00000000
/dev/input/event7: 0003 0035 00000000
/dev/input/event7: 0003 0036 00000280
/dev/input/event7: 0000 0002 00000000
/dev/input/event7: 0000 0000 00000000

/dev/input/event7: 0003 0035 00000001
/dev/input/event7: 0003 0036 00000280
/dev/input/event7: 0000 0002 00000000
/dev/input/event7: 0003 0035 00000143
/dev/input/event7: 0003 0036 00000280
/dev/input/event7: 0000 0002 00000000
/dev/input/event7: 0000 0000 00000000

/dev/input/event7: 0003 0035 00000001
/dev/input/event7: 0003 0036 00000280
/dev/input/event7: 0000 0002 00000000
/dev/input/event7: 0003 0035 00000143
/dev/input/event7: 0003 0036 00000280
/dev/input/event7: 0000 0002 00000000
/dev/input/event7: 0000 0000 00000000

/dev/input/event7: 0003 0035 00000001
/dev/input/event7: 0003 0036 0000027f
/dev/input/event7: 0000 0002 00000000
/dev/input/event7: 0003 0035 00000143
/dev/input/event7: 0003 0036 0000027f
/dev/input/event7: 0000 0002 00000000
/dev/input/event7: 0000 0000 00000000

/dev/input/event7: 0003 0035 00000002
/dev/input/event7: 0003 0036 0000027f
/dev/input/event7: 0000 0002 00000000
/dev/input/event7: 0003 0035 00000142
/dev/input/event7: 0003 0036 0000027f
/dev/input/event7: 0000 0002 00000000
/dev/input/event7: 0000 0000 00000000

/dev/input/event7: 0003 0035 00000003
/dev/input/event7: 0003 0036 0000027f
/dev/input/event7: 0000 0002 00000000
/dev/input/event7: 0003 0035 00000141
/dev/input/event7: 0003 0036 0000027f
/dev/input/event7: 0000 0002 00000000
/dev/input/event7: 0000 0000 00000000

//松开鼠标左键
/dev/input/event7: 0001 014a 00000000
/dev/input/event7: 0003 003a 00000000
/dev/input/event7: 0000 0002 00000000
/dev/input/event7: 0000 0000 00000000

//松开control
/dev/input/event7: 0001 007d 00000000
/dev/input/event7: 0000 0000 00000000

  这里有个要注意的地方,首先,getevent得到的代码是十六进制的,但是用sendevent输入时要求使用十进制,需要对代码进行转换。

  其中,

/dev/input/event7: 0001 014a 
/dev/input/event7: 0003 003a 

是代表摁下的事件代码,后面是1时代表摁下,是0时代表松开;

/dev/input/event7: 0003 0035 
/dev/input/event7: 0003 0036 

是代表时间坐标的代码,0x 0003 0035对应的是x坐标,0x 0003 0036对应的是y坐标;

/dev/input/event7: 0000 0002 00000000
/dev/input/event7: 0000 0000 00000000

0000 0002 00000000是代表同步操作,我的理解是将本次事件放入事件队列中,开始执行,0000 0000 00000000是代表一次输入结束,我认为也代表了一次事件的结束;

所以将上述代码转换为十进制后,长摁可以用以下代码进行模拟:

adb shell sendevent /dev/input/event7 0001 0330 00000001
adb shell sendevent /dev/input/event7 0003 0058 00000001
adb shell sendevent /dev/input/event7 0003 0053 00000290
adb shell sendevent /dev/input/event7 0003 0054 00000469
adb shell sendevent /dev/input/event7 0000 0002 00000000
adb shell sendevent /dev/input/event7 0000 0000 00000000

  之后,我们可以看一下模拟双指缩放的事件代码:

/dev/input/event7: 0003 0035 00000144
/dev/input/event7: 0003 0036 00000280
/dev/input/event7: 0000 0002 00000000
/dev/input/event7: 0003 0035 00000000
/dev/input/event7: 0003 0036 00000280
/dev/input/event7: 0000 0002 00000000
/dev/input/event7: 0000 0000 00000000

这是左键摁下之后的代码,我们可以看出,主要分为三个部分:

/dev/input/event7: 0003 0035 00000144
/dev/input/event7: 0003 0036 00000280
/dev/input/event7: 0000 0002 00000000
以及
/dev/input/event7: 0003 0035 00000000
/dev/input/event7: 0003 0036 00000280
/dev/input/event7: 0000 0002 00000000
以及
/dev/input/event7: 0000 0000 00000000

所以,我们可以看到两点触控的操作需要两个点的输入操作以及同步操作,在结束后加上终止操作来完成整个事件,因此,加入多个点的坐标输入和同步操作,保持一个终止操作就可以得到三点、四点等多点操作的方式。

于是,我们可以这样模拟一个简单的双指滑动:

adb shell sendevent /dev/input/event7 0001 0330 00000001
adb shell sendevent /dev/input/event7 0003 0058 00000001
adb shell sendevent /dev/input/event7 0003 0053 00000290
adb shell sendevent /dev/input/event7 0003 0054 00000469
adb shell sendevent /dev/input/event7 0000 0002 00000000
adb shell sendevent /dev/input/event7 0003 0053 00000490
adb shell sendevent /dev/input/event7 0003 0054 00000290
adb shell sendevent /dev/input/event7 0000 0002 00000000
adb shell sendevent /dev/input/event7 0000 0000 00000000
adb shell sendevent /dev/input/event7 0003 0053 00000292
adb shell sendevent /dev/input/event7 0003 0054 00000470
adb shell sendevent /dev/input/event7 0000 0002 00000000
adb shell sendevent /dev/input/event7 0003 0053 00000487
adb shell sendevent /dev/input/event7 0003 0054 00000289
adb shell sendevent /dev/input/event7 0000 0002 00000000
adb shell sendevent /dev/input/event7 0000 0000 00000000

同理,多点长摁,多点滑动等操作也可以这样拓展出来。

您可能感兴趣的与本文相关内容

评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值