Android多点触摸的实现
2010-09-10 00:51:00 来源:WEB开发网第三章 同步方式
由于多点触摸技术需要采集到多个点,然后再一起处理这些点,所以在软件实现中需要保证每一波点的准确性和完整性。因此,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 的 KeyInputQueue.java 中,系统创建了一个线程,然后把所有的 Input 事件放入一个队列:
public abstract class KeyInputQueue {
……………………
Thread mThread = new Thread("InputDeviceReader") {
public void run() {
android.os.Process.setThreadPriority(
android.os.Process.THREAD_PRIORITY_URGENT_DISPLAY);
try {
RawInputEvent ev = new RawInputEvent();
while (true) {
InputDevice di;
// block, doesn't release the monitor
readEvent(ev);
if (ev.type == RawInputEvent.EV_DEVICE_ADDED) {
synchronized (mFirst) {
di = newInputDevice(ev.deviceId);
mDevices.put(ev.deviceId, di);
configChanged = true;
}
} else if (ev.type == RawInputEvent.EV_DEVICE_REMOVED) {
synchronized (mFirst) {
Log.i(TAG, "Device removed: id=0x"
+ Integer.toHexString(ev.deviceId));
di = mDevices.get(ev.deviceId);
if (di != null) {
mDevices.delete(ev.deviceId);
configChanged = true;
更多精彩
赞助商链接