WEB开发网
开发学院手机开发Android 开发 Android多点触摸的实现 阅读

Android多点触摸的实现

 2010-09-10 00:51:00 来源:WEB开发网   
核心提示:ABS_PRESSURE, ABS_X, ABS_Y 等,另外,Android多点触摸的实现(3),由于在 Android2.0 前支持多点的 frameworks 大多是用 HAT0X,HAT0Y 来实现的,所以一般也会上报这 2 个事件,也需要一次input_my_sync ,在Android 的 KeyInput
ABS_PRESSURE, ABS_X, ABS_Y 等。另外,由于在 Android2.0 前支持多点的 frameworks 大多是用 HAT0X,HAT0Y 来实现的,所以一般也会上报这 2 个事件。

第三章 同步方式

由于多点触摸技术需要采集到多个点,然后再一起处理这些点,所以在软件实现中需要保证每一波点的准确性和完整性。因此,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;

上一页  1 2 3 4 5 6 7 8  下一页

Tags:Android 多点 触摸

编辑录入:coldstar [复制链接] [打 印]
赞助商链接