Android多点触控

  • Android多点触控
    • 多点触控实现思路
    • 第一种adb shell input方式
    • 第二种adb shell sendevent方式

多点触控实现思路

  经过资料的查询,要在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 1000adb 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 00000001adb shell sendevent /dev/input/event7 0003 0058 00000001adb shell sendevent /dev/input/event7 0003 0053 00000290adb shell sendevent /dev/input/event7 0003 0054 00000469adb shell sendevent /dev/input/event7 0000 0002 00000000adb 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 00000001adb shell sendevent /dev/input/event7 0003 0058 00000001adb shell sendevent /dev/input/event7 0003 0053 00000290adb shell sendevent /dev/input/event7 0003 0054 00000469adb shell sendevent /dev/input/event7 0000 0002 00000000adb shell sendevent /dev/input/event7 0003 0053 00000490adb shell sendevent /dev/input/event7 0003 0054 00000290adb shell sendevent /dev/input/event7 0000 0002 00000000adb shell sendevent /dev/input/event7 0000 0000 00000000adb shell sendevent /dev/input/event7 0003 0053 00000292adb shell sendevent /dev/input/event7 0003 0054 00000470adb shell sendevent /dev/input/event7 0000 0002 00000000adb shell sendevent /dev/input/event7 0003 0053 00000487adb shell sendevent /dev/input/event7 0003 0054 00000289adb shell sendevent /dev/input/event7 0000 0002 00000000adb shell sendevent /dev/input/event7 0000 0000 00000000

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

更多相关文章

  1. android 事件处理(三)
  2. Welcome, Android Q(刷机有风险,操作需谨慎)
  3. android保存手势操作到文件&读取识别手势
  4. Android 线程操作之线程池
  5. Android 数据操作之SQLiteDatabase
  6. Android开发实践 事件处理机制 全面分析

随机推荐

  1. 编译Android出现/usr/bin/ld: cannot fin
  2. 将程序装到sdcard上
  3. Imageview图片圆形显示
  4. 【翻译】(23)NDK Stack
  5. android 权限管理和签名 实现静默卸载
  6. Android Handler(三)
  7. Android 获取assets的绝对路径
  8. Android之ViewPager自动循环播放(轮播)效果
  9. Android 滤镜效果
  10. Android 计时与倒计时