为了使用功能强大的多点触控设备,就需要一种方案去上报用户层所需的详细的手指触摸数据。这个文档所描述的多点触控协议可以让内核驱动程序向用户层上报任意多指的数据信息。

使用说明

单点触摸信息是以ABS承载并按一定顺序发送,如BTN_TOUCH、ABS_X、ABS_Y、SYNC。而多点触摸信息则是以ABS_MT承载并按一定顺序发送,如ABS_MT_POSITION_X、ABS_MT_POSITION_Y,然后通过调用input_mt_sync()产生一个 SYN_MT_REPORT event来标记一个点的结束,告诉接收方接收当前手指的信息并准备接收其它手指的触控信息。最后调用 input_sync()函数上报触摸信息开始动作并告诉接收方开始接收下一系列多点触摸信息。

协议定义了一系列ABS_MT事件,这些事件被分为几大类,充许只应用其中的一部份,多点触摸最小的事件集中应包括ABS_MT_TOUCH_MAJOR、ABS_MT_POSITION_X和 ABS_MT_POSITION_Y,以此来实现多点触摸。如果设备支持ABS_MT_WIDTH_MAJOR这个事件,那么此事件可以提供手指触摸接触面积大小。触摸方向等信息可以由ABS_MT_TOUCH_MINOR, ABS_MT_WIDTH_MINOR and ABS_MT_ORIENTATION提供。ABS_MT_TOOL_TYPE提供触摸设备的类别,如手或是笔或是其它。最后有些设备可能会支持ABS_MT_TRACKING_ID,用来支持硬件跟踪多点信息,即该点属于哪一条线等。

下面是两点触摸支持的最小事件集序列:

ABS_MT_TOUCH_MAJOR

ABS_MT_POSITION_X

ABS_MT_POSITION_Y

SYN_MT_REPORT      //上报第一个点

ABS_MT_TOUCH_MAJOR

ABS_MT_POSITION_X

ABS_MT_POSITION_Y

SYN_MT_REPORT      //上报第二个点

SYN_REPORT         //开始动作

Event 原语

“接触”一词用来描述一个物体直接碰到另一个物体的表面。

ABS_MT_TOUCH_MAJOR描述了主接触面的长轴,它和X,Y同一个单位,如果一个面的分辨率为X*Y,则ABS_MT_TOUCH_MAJOR的最大值为sqrt(X^2+Y^2)

ABS_MT_TOUCH_MINOR描述了接触面的短轴,如果接触面是圆形,它可以不用。

ABS_MT_WIDTH_MAJOR描述了接触工具的长轴

ABS_MT_WIDTH_MINOR描述了接触工具的短轴

ABS_MT_TOUCH_MAJOR := max(X, Y)

ABS_MT_TOUCH_MINOR := min(X, Y)

ABS_MT_ORIENTATION := bool(X > Y)

以上四个参数可以用来生成额外的触摸信息,如ABS_MT_TOUCH_MAJOR/ABS_MT_WIDTH_MAJOR的比率可以用来描述压力。

ABS_MT_ORIENTATION

ABS_MT_POSITION_X接触面的中心点X坐标

ABS_MT_POSITION_Y接触面的中心点Y坐标

ABS_MT_TOOL_TYPE描述接触工具类型,很多内核驱动无法区分此参数如手指及笔,如果是这样,该参数可以不用,协议目前支持MT_TOOL_FINGER和MT_TOOL_PEN两种类型。

ABS_MT_BLOB_ID形状集ID,集合几个点以描述一个形状,很多驱动没有形状属性,此参数可以不用。

ABS_MT_TRACKING_ID描述了从接触开始到释放的整个过程的集合,如果设备不支持,此参数可是不用。

触摸轨迹

仅有少数设备可以明触的标识真实的 trackingID,多数情况下 trackingID只能来标识一次触摸动作的过程。

手势

多点触摸指定的应用是创建手势动作, TOUCH和 WIDTH参数经常用来区别手指的压力和手指间的距离,另外 MINOR类的参数可以用来区别设备的接触面的大小(点接触还是面接触),ORIENTATION可以产生旋转事件。

在Linux内核支持的基础上,Android在其2.0源码中加入多点触摸功能。由此触摸屏在Android的frameworks被完全分为2种实现途径:单点触摸屏的单点方式,多点触摸屏的单点和多点方式。

在Linux的input.h中,多点触摸功能依赖于以下几个主要的软件位:

……

#define SYN_REPORT0

#define SYN_CONFIG1

#define SYN_MT_REPORT2

……

#define ABS_MT_TOUCH_MAJOR0x30

#define ABS_MT_TOUCH_MINOR0x31

#define ABS_MT_WIDTH_MAJOR0x32

#define ABS_MT_WIDTH_MINOR0x33

#define ABS_MT_ORIENTATION0x34

#define ABS_MT_POSITION_X0x35

#define ABS_MT_POSITION_Y0x36

#define ABS_MT_TOOL_TYPE0x37

#define ABS_MT_BLOB_ID0x38

……

在Android中对应的软件位定义在RawInputEvent.java中:

……

public class RawInputEvent {

……

public static final int CLASS_TOUCHSCREEN_MT = 0x00000010;

……

public static final int ABS_MT_TOUCH_MAJOR = 0x30;

public static final int ABS_MT_TOUCH_MINOR = 0x31;

public static final int ABS_MT_WIDTH_MAJOR = 0x32;

public static final int ABS_MT_WIDTH_MINOR = 0x33;

public static final int ABS_MT_ORIENTATION = 0x34;

public static final int ABS_MT_POSITION_X = 0x35;

public static final int ABS_MT_POSITION_Y = 0x36;

public static final int ABS_MT_TOOL_TYPE = 0x37;

public static final int ABS_MT_BLOB_ID = 0x38;

……

public static final int SYN_REPORT = 0;

public static final int SYN_CONFIG = 1;

public static final int SYN_MT_REPORT = 2;

……

在Android中,多点触摸的实现方法在具体的代码实现中和单点是完全区分开的。在Android代码的EventHub.cpp中,单点屏和多点屏由如下代码段来判定:

int EventHub::open_device(const char *deviceName)

{

……

if (test_bit(ABS_MT_TOUCH_MAJOR, abs_bitmask)

&& test_bit(ABS_MT_POSITION_X, abs_bitmask)

&& test_bit(ABS_MT_POSITION_Y, abs_bitmask)) {

device->classes |= CLASS_TOUCHSCREEN | CLASS_TOUCHSCREEN_MT;

//LOGI("It is a multi-touch screen!");

}

//single-touch?

else if (test_bit(BTN_TOUCH, key_bitmask)

&& test_bit(ABS_X, abs_bitmask)

&& test_bit(ABS_Y, abs_bitmask)) {

device->classes |= CLASS_TOUCHSCREEN;

//LOGI("It is a single-touch screen!");

}

……

}

我们知道,在触摸屏驱动中,通常在probe函数中会调用input_set_abs_params给设备的input_dev结构体初始化,这些input_dev的参数会在Android的EventHub.cpp中被读取。如上可知,如果我们的触摸屏想被当成多点屏被处理,只需要在驱动中给input_dev额外增加以下几个参数即可:

input_set_abs_params(mcs_data.input, ABS_MT_POSITION_X, pdata->abs_x_min,  pdata->abs_x_max, 0, 0);

input_set_abs_params(mcs_data.input, ABS_MT_POSITION_Y, pdata->abs_y_min,  pdata->abs_y_max, 0, 0);

input_set_abs_params(mcs_data.input, ABS_MT_TOUCH_MAJOR, 0, 15, 0, 0);

//相当于单点屏的ABX_PRESSURE

input_set_abs_params(mcs_data.input, ABS_MT_WIDTH_MAJOR, 0, 15, 0, 0);

//相当于单点屏的ABS_TOOL_WIDTH

由于多点触摸技术需要采集到多个点,然后再一起处理这些点,所以在软件实现中需要保证每一波点的准确性和完整性。因此,Linux内核提供了input_mt_sync(struct input_dev * input)函数。在每波的每个点上报后需要紧跟一句input_mt_sync(), 当这波所有点上报后再使用input_sync()进行同步。

例如一波要上报3个点:

……

input_mt_sync(input);

……

input_mt_sync(input);

……

input_mt_sync(input);

input_sync(input);

注:即使是仅上报一个点的单点事件,也需要一次input_my_sync。

linux多点触控协议数据结构定义,Linux与Android 多点触摸协议相关推荐

  1. 10_10_安卓加linux命令,Scrcpy 1.11版支持Android 10及多点触控手势,附Linux下安装命令...

    Scrcpy 1.11版本增加了对Android 10的支持及多点触控手势,现在就可以在Linux系统下安装Scrcpy的更新版本,该工具可让你在PC上镜像Android手机. 更新说明 Scrcpy ...

  2. linux获取触控板信息,关于linux:Linux-下通过命令行和脚本开关笔记本触控板和其他输入外设...

    应用xinput命令,能够查看和更改以后零碎的输出设施状态. xinput -list能够查看以后零碎存在的输出设施和其id $ xinput -list ⎡ Virtual core pointer ...

  3. linux禁用触控板驱动程序,Ubuntu Linux下笔记本禁用触摸板的方法 - 51CTO.COM

    一般情况下,是使用synaptics触摸板驱动. 最直接的方法,就是卸载synaptics驱动.sudo apt-get autoremove synaptics 但是如果一旦需要使用触摸板,还要把驱 ...

  4. android 多点触控缩放,【移动开发】Android中图片的多点触控和缩放

    前几天做项目用到相机拍照,之后能对图片进行缩放,拖拽,在此我将其单独抽取出来,后面用到时直接拿来用就行了! 效果图: 注:这里不仅能按钮缩放,还能多点触摸缩放和拖拽功能! 1.布局: android: ...

  5. vue 多点触控手势_涨姿势了!Appium也可以多点触控操作

    有头发且有趣的码农万里挑一~ 104 有料叔 | 一位有故事的程序猿 在网页中我们经常使用缩放操作来便利的查看具体的信息,在appium中使用MultiAction多点触控的类来实现 MultiAct ...

  6. 多点触控 - MFC

    概述 Windows 7 支持用户通过手指接触来管理应用程序,无需使用中间设备.这扩展了平板 PC 基于触笔的功能.与其他指针设备不同,这种新功能允许多个输入事件在不同指针位置同时发生,它还支持复杂的 ...

  7. 多点触控液晶三维电子沙盘 实景三维电子沙盘

    多点触控液晶三维电子沙盘 实景三维电子沙盘 多点触控液晶三维电子沙盘 实景三维电子沙盘(3dgis.top)采用大数据.三维GIS.物联网.可视化等先进技术,具有手势触控.语音控制.深度学习.视频识别 ...

  8. android怎么监听多点触摸_什么是多点触控技术,有哪些用途

    自从乔布斯将触控技术用于苹果手机上,很多的手机厂商纷纷效仿,触控技术几乎成为手机的"标配".其实,触控技术早就存在,只是一直未能大面积用于各种设备中,本文将带您认识神奇的触控技术. ...

  9. Windows Phone 7范例游戏Platformer实战5——多点触控编程

    即使是再有经验的XNA程序员,在开始Windows Phone 7上的游戏开发时也不得不学习下多点触控这个新的实现方法.虽然目前有些Windows Phone 7手机附带了键盘,但是为了对所有WP7手 ...

  10. 89600 matlab,是德KEYSIGHT N9000B CXA 信号分析仪,多点触控,9 kHz 至 26.5 GHz

    是德KEYSIGHT N9000B CXA 信号分析仪,多点触控,9 kHz 至 26.5 GHz 产品名称:CXA 信号分析仪,多点触控,9 kHz 至 26.5 GHz 产品型号:N9000B 厂 ...

最新文章

  1. 关于学习Python的一点学习总结(47->静态方法和类方法)
  2. 从CTO到创始人 孙元浩基础软件破局之路
  3. 李飞飞、吴恩达、Bengio等人的15大顶级深度学习课程
  4. my java note ---- 绑定
  5. 宿舍助手app——个人工作第四天
  6. Spark平台上提交作业到集群生成的日志文件
  7. Vue3里的setup中使用vuex
  8. 【中部武汉】理想离家并不遥远
  9. matlab去除图片水印_(水印去除技巧)3个在线图片水印去除网站,值得收藏
  10. Hyperledger Fabric服务器配置及修改Docker容器卷宗存储根目录/位置
  11. 使用未初始化的内存是什么意思_活动板房是什么意思?怎么装修?使用年限+价格知识点合集...
  12. 微信小程序源码及H5小游戏源码内核构建方法
  13. java 体检套餐_体检套餐的项目
  14. 重装系统时的硬盘格式化
  15. 关于HTML的table表格换行一事
  16. 如何用ftp上传到服务器视频文件,ftp如何将文件上传到服务器上
  17. python爬虫系列——拉勾网
  18. 搞IT的you知道这些么……
  19. Pandas str列内置方法
  20. 在CygWin中设置proxy

热门文章

  1. 计算机网络概述上海电力,上海电力大学2021考研复试计算机网络考试大纲
  2. 上海交通大学计算机专业考研多少分进复试,2019考研:初试分数370+,有希望进上海交通大学么?...
  3. 【C语言】求最大值 (完整代码)
  4. Mari对称开启后另一半全粉了,变纯色了。
  5. android 古诗,古诗词朗诵安卓
  6. springboot 问卷调查系统
  7. 小心!QQ和MSN聊天记录也会随时被监控
  8. 装系统:主分区、扩展分区、逻辑分区,引导(启动)分区、系统分区、活动分区
  9. 赛尔号服务器维护时间2月13,赛尔号2月13日更新福利活动汇总 重生之翼王者归来大暗黑天刻印放送...
  10. 去水印小程序源码,全新界面无加密,平台支持微信小程序和QQ小程序。支持解析抖音、快手、皮皮虾和微视等平台。带PHP下载接口。支持微信QQ流量主