Android多点触摸的实现
2010-09-10 00:51:00 来源:WEB开发网+ MotionEvent.SAMPLE_PRESSURE] = ev.value;
} else if (ev.scancode == RawInputEvent.ABS_TOOL_WIDTH) {
di.mAbs.changed = true;
di.curTouchVals[MotionEvent.SAMPLE_SIZE] = ev.value;
di.curTouchVals[MotionEvent.NUM_SAMPLE_DATA
+ MotionEvent.SAMPLE_SIZE] = ev.value;
}
…………………………………………… .}
/* 下面是关键的同步处理方法 */
if (ev.type == RawInputEvent.EV_SYN
&& ev.scancode == RawInputEvent.SYN_MT_REPORT
&& di.mAbs != null) {
/* 在这里实现了对 SYN_MT_REPORT 事件的处理,
* 改变了 di.mAbs.mAddingPointerOffset 的值,从而将
* 新增的点的参数保存到下一组偏移量的位置。
*/
…………………… .
final int newOffset = (num <= InputDevice.MAX_POINTERS)
? (num * MotionEvent.NUM_SAMPLE_DATA)
: (InputDevice.MAX_POINTERS *
MotionEvent.NUM_SAMPLE_DATA);
di.mAbs.mAddingPointerOffset = newOffset;
di.mAbs.mNextData[newOffset
+ MotionEvent.SAMPLE_PRESSURE] = 0;
}
……………… .
} else if (send || (ev.type == RawInputEvent.EV_SYN
&& ev.scancode == RawInputEvent.SYN_REPORT)) {
/* 这里实现了对 SYN_REPORT 事件的处理
* 如果是单点触摸屏,即使用 di.curTouchVals 数组保存的点
* 转化为多点触摸屏的 mNextData 数组保存
* 最后是调用 InputDevice 中的 generateAbsMotion 处理这个数组。这个函数
* 的具体实现方法将在后面补充
*/
………………………… ..
ms.finish(); //重置所有点和偏移量
…………………… ..
}
由于上层的代码仍然使用ABS_X, ABS_Y 这些事件,为了使多点触摸屏代码有良好的兼容性,在 KeyInputQueue.java 的最后,我们将多点事件类型转化为单点事件类型,返回一个新的 InputDevice:
private InputDevice newInputDevice(int deviceId) {
更多精彩
赞助商链接