android 触摸接口,Android 多点触摸接口
简介
为了使用功能强大的多点触控设备,就需要一种方案去上报用户层所需的详细的手指触摸数据。这个文档所描述的多点触控协议可以让内核驱动程序向用户层上报任意多指的数据信息。
使用说明
单点触摸信息是以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/* Major axis of touching ellipse */
#define ABS_MT_TOUCH_MINOR0x31/* Minor axis (omit if circular) */
#define ABS_MT_WIDTH_MAJOR0x32/* Major axis of approaching ellipse */
#define ABS_MT_WIDTH_MINOR0x33/* Minor axis (omit if circular) */
#define ABS_MT_ORIENTATION0x34/* Ellipse orientation */
#define ABS_MT_POSITION_X0x35/* Center X ellipse position */
#define ABS_MT_POSITION_Y0x36/* Center Y ellipse position */
#define ABS_MT_TOOL_TYPE0x37/* Type of touching device */
#define ABS_MT_BLOB_ID0x38/* Group a set of packets as a blob */
…………………………
在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个点:
/*上报点1*/
……………..
input_mt_sync(input);
/*上报点2*/
……………..
input_mt_sync(input);
/*上报点3*/
……………..
input_mt_sync(input);
input_sync(input);
注:即使是仅上报一个点的单点事件,也需要一次input_my_sync。
android 触摸接口,Android 多点触摸接口相关推荐
- ios实例开发精品文章推荐(8.12)11个处理触摸事件和多点触摸的JS库
11个处理触摸事件和多点触摸的JS库 触摸屏是现在所有智能手机的标配,还包括各种平板设备,而且很多桌面也慢慢在开始支持触摸操作.要开发支持触摸屏设备的Web应用,我们需要借助浏览器的触摸事件来实现. ...
- unity3d透明投影+红外线激光多点触摸+unity win7多点触摸案例
透明投影+红外线激光多点触摸+unity win7多点触摸案例 明投影+红外线激光多点触摸+unity win7多点触摸案例 迟点把这个多点触摸的资料分享给大家 密码:www.yeehot.com 下 ...
- android怎么监听多点触摸_大尺寸触摸屏厂家定制多点触摸框
深圳融创方圆是订做红外大尺寸触摸屏生产厂家,弧形/直角/异形/U型大尺寸红外多点触摸框定做15寸-1000寸超大尺寸红外触控屏可以用于配合液晶拼接屏,DLP拼接屏,无缝拼接屏,小间距LED.互动投影. ...
- android怎么监听多点触摸_110寸高清触摸一体机
110寸高清触摸一体机也是叫110寸会议平板,110寸高清触控一体机,110寸教学培训触控一体机,110寸展厅触摸一体机,110寸高清交互会议机,110寸展示查询触摸一体机,110寸移动壁挂触控显示屏 ...
- android怎么监听多点触摸_Android多点触摸交互处理
触摸操作是安卓最基本的交互方法,掌握多点触摸的开发可增强应用交互体验.首先需要了解触摸事件的侦听和传递,同时,本文介绍了单点.多点触摸的使用方法,并在此基础上,使用多点触控完成了一个缩放照片的简单例子 ...
- android怎么监听多点触摸_Android开发中多点触摸的实现方法
Android多点触控需要LCD驱动和程序设计支持,其实我们只要采用电容屏触摸手机的技术即可,接下来,就让爱站技术频道小编来讲解Android开发中多点触摸的实现方法吧! 多点触摸技术在实际开发过程中 ...
- android 图片放大缩小 多点触摸,Android 多点触摸(图片放大缩小)
就不说什么了,有注释 基本有基础的都看得懂 欢迎加入我的交流群: 386451316 main.xml文件 xmlns:tools="http://schemas.android.com/t ...
- android怎么监听多点触摸_什么是多点触控技术,有哪些用途
自从乔布斯将触控技术用于苹果手机上,很多的手机厂商纷纷效仿,触控技术几乎成为手机的"标配".其实,触控技术早就存在,只是一直未能大面积用于各种设备中,本文将带您认识神奇的触控技术. ...
- Android 4.0屏蔽式多点触摸
比方这张图.我想不接或者接单,二者仅仅能点一个,不能同一时候点击,否则会造成混乱.我们仅仅要在嵌套他们俩的布局中增加这么一段话: android:splitMotionEvents="fal ...
- Linux/Android多点触摸协议
链接点击打开链接 关于Linux多点触摸协议大家可以参考kernel中的文档:https://www.kernel.org/doc/Documentation/input/multi-touch-pr ...
最新文章
- ext-2.2.1下载地址
- codeblocks断点不停,无效问题终极解决
- Test Report
- HashTable 和HashMap区别
- 自言自语(2011.8.1)
- 输出斐波那契数列不大于1000的序列
- 迭代器模式的原理和实现
- 常见EDA软件的license管理
- spring mvc数据绑定与表单标签库
- Ubuntu16.04安装百度网盘亲测可用
- cruzer php sandisk 闪迪u盘量产工具_SanDisk Cruzer Micro(闪迪U盘量产助手)V1.1 最新版
- shell脚本:编辑脚本check_host.sh,自动检测主机如下信息
- Android之微信界面设计
- win10新建计算机账户,Windows10系统创建microsoft帐户的方法
- 分部积分出现积回去的情况
- 环境监测历史数据(AQI历史数据)
- Flash之SM25QH128M、JFM25F32A读写操作FPGA Verilog实现
- prepay id为空php,微信公众号支付踩坑笔记
- N1盒子青龙自用一套教程
- 学习DNS路上之CloudXNS
热门文章
- 什么是数据运营?数据运营是做什么的?
- html加拼音注释,《弟子规》全文带拼音注释(下)
- [微信小程序开发者工具] × #initialize
- 使用SpringBoot完成RabbitMQ与Dubbo框架集成例程
- 飞鱼星路由器如何限制外网访问服务器网站,飞鱼星路由器怎么访问指定网站
- FPGA LVDS液晶屏
- Saliency Detection: A Spectral Residual Approach
- 【Three.js】十二、three.js摄像机控件
- 一图读懂昇思MindSpore · 图算融合 | 破而后立,晓喻新生
- ios手游游戏辅助挂机工具_ios挂机RPG游戏大全_iPhone挂机RPG类手游排行榜_ios挂机RPG类手游精选推荐_ios挂机RP类手游下载...