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

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

模拟Android多点触控相关推荐

  1. Android多点触控详解

    本文转载自GcsSloop的 安卓自定义View进阶-多点触控详解 的文章 Android 多点触控详解,在前面的几篇文章中我们大致了解了 Android 中的事件处理流程和一些简单的处理方案,本次带 ...

  2. STM32模拟USB多点触控屏

    STM32模拟USB多点触控屏 开发准备 STM32的USB官方例程库JoyStickMouse STM32F103RC Windows7 代码修改 1.usb_pwr.c RESULT PowerO ...

  3. Android多点触控揭秘

    本文原创,转载请注明:http://blog.csdn.net/cloudzfy1/article/details/6582707 Google 暑期大学生博客分享大赛 - 2011 Android ...

  4. Android多点触控技术

    1 简介 Android多点触控在本质上需要LCD驱动和程序本身设计上支持,目前市面上HTC.Motorola和Samsung等知名厂商只要使用电容屏触控原理的手机均可以支持多点触控Multitouc ...

  5. Android 多点触控消息捕获与处理

    1 简介 Android多点触控在本质上需要LCD驱动和程序本身设计上支持,目前市面上HTC.Motorola和Samsung等知名厂商只要使用电容屏触控原理的手机均可以支持多点触控Multitouc ...

  6. Android 多点触控 MotionEvent详解

    相关API 介绍 MotionEvent.getY() 和 MotionEvent.getRawY() 的区别 getY 表示触摸事件在当前的View内的Y 坐标, getRawY表示触摸事件在整个屏 ...

  7. Android多点触控MultiTouch浅析

    申明: 参考:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2013/0226/914.html 下面实现如何通过应用层支持多点触控操作, ...

  8. android 多点触控缩放,Android多点触控(图片的缩放Demo)

    本文主要介绍Android的多点触控,使用了一个图片缩放的实例,来更好的说明其原理.需要实现OnTouchListener接口,重写其中的onTouch方法. 实现效果图: 源代码: 布局文件: ac ...

  9. 关于android多点触控

    最近项目需要一个多点触控缩放的功能.然后上网查了下资料 总结一下: 首先android sdk版本很重要,比如你在AndroidManifest.xml中指定android:minSdkVersion ...

最新文章

  1. linux su和sudo命令的区别(转)
  2. Oracle排序中NULL值处理的五种常用方法
  3. Python Mixin技术介绍
  4. 有关UITabbarController的一些重要属性
  5. java jdbc 详解_JDBC概述及详解各个对象
  6. 嵌套访问_利用Idea重构功能及Java8语法特性——优化深层嵌套代码
  7. Linux下LAMP服务配置
  8. Vue-pdf预览pdf文档
  9. 后渗透攻击阶段 PTES
  10. 通过python实现网页录音的效果--思路
  11. 模拟量开环控制系统的组成
  12. Windows Docker Desktop 无法启动报错 Docker Desktop is shutting down 的可能解决办法
  13. 个人计算机架构和相关的设备组件
  14. 在网页上嵌入微博--微博秀
  15. wireguard如何配置----服务端
  16. android 圆圈扩大动画,Android实现3个圆圈的动画
  17. 2021最新MySQL数据库面试题
  18. 获取手机的设备信息和唯一ID
  19. python判断一个字符串是不是ip地址
  20. 《数据清洗》8.3.8 加载电影数据至电影维度表

热门文章

  1. 《java设计模式》读书笔记
  2. 1427.分解质因数
  3. 联想服务器刀片机型号,ThinkSystem SN550刀片服务器
  4. 力扣中国(LeetCode) 算法题 有效独数(python)
  5. Gradle 7.4 包上传私服
  6. CVE-2020-1472: NetLogon特权提升漏洞通告
  7. IOS 锁屏 状态下,看到歌手图片
  8. 漫画 | 什么是 HashMap?
  9. Scons安装和使用
  10. 配置服务器的dns文件是什么意思,什么是服务器配置,DNS服务器如何配置