解析触摸屏上报的数据:
单点触摸事件上报流程:
# 点击触摸屏时
BTN_TOUCH //事件发生
ABS_X //绝对X
ABS_Y //绝对Y
SYN_REPORT //同步事件
# 滑动
ABS_X
ABS_Y
SYN_REPORT
# 松开
BTN_TOUCH
SYN_REPORT
当手指点击触摸屏时,首先上报 BTN_TOUCH 事件,此时 value=1,表示按下;接着上报 ABS_X、 ABS_Y事件将 X、 Y 轴坐标数据发送给应用层;数据上报完成接着上报一个同步事件 SYN_REPORT,表示此次触摸点信息已经完整。
当手指在触摸屏上滑动时,并不会上报 BTN_TOUCH 事件,因为滑动过程并未发生按下、松开这种动作。
当松开时,首先上报了 BTN_TOUCH 事件,此时 value=0,表示手指已经松开了触摸屏,接着上报一个同步事件 SYN_REPORT。
多点触摸设备上报数据的流程:
ABS_MT_SLOT 0
ABS_MT_TRACKING_ID 10
ABS_MT_POSITION_X
ABS_MT_POSITION_Y
ABS_MT_SLOT 1
ABS_MT_TRACKING_ID 11
ABS_MT_POSITION_X
ABS_MT_POSITION_Y
SYN_REPORT
slot 是硬件上的一个概念、而 ID 则可认为是软件上的一个概念;对于一个多点触摸设备来说,它最大支持的触摸点数是确定的,譬如 5 个触摸设备,最多支持 5 个触摸点;每一个触摸点在硬件上它有一个区分的编号,譬如触摸点0、触摸点 1、触摸点 2 等,这个编号就是一个 slot(通常从 0 开始) ; 如何给识别到的触点分配一个 slot 呢(触点与 slot 关联)?通常是按照时间先后顺序来的,譬如第一根手指先触碰到触摸屏,那第一根手指就对应触摸点 0(slot=0),接着第二根手指触碰到触摸屏则对应触摸点 1(slot=1)以此类推! 这个通常是硬件所支持的。
而 ID 可认为是软件上的一个概念,它也用于区分不同的触摸点,但是它跟 slot 不同, 不是同一层级的概念;举个例子,譬如一根手指触碰到触摸屏之后拿开,然后再次触碰触摸屏,这个过程中,假设只有这一根手指进行触碰操作,那么两次触碰对应都是触摸点 0(slot=0),这个无疑义!但从触摸点的生命周期来看, 它们是同一个触摸点吗?答案肯定不是,为啥呢?手指从触摸屏上离开后,该触摸点就消失了、被删除了, 该触摸点的生命周期也就到此结束了,所以它们自然是不同的触摸点, 所以它们的 ID 是不同的