开发学院手机开发Android 开发 Android事件处理:按键、触摸屏和滚动球的一些实现... 阅读

Android事件处理:按键、触摸屏和滚动球的一些实现细节

 2010-08-22 04:56:00 来源:WEB开发网   
核心提示:}}readEvent() 实际上调用的是 com_android_server_KeyInputQueue.cpp (frameworksaseservicesjni)中的:static jboolean android_server_KeyInputQueue_readEvent(JNIEnv* env, job

}

}

readEvent() 实际上调用的是 com_android_server_KeyInputQueue.cpp (frameworksaseservicesjni)中的:

static jboolean android_server_KeyInputQueue_readEvent(JNIEnv* env, jobject clazz,jobject event)

bool res = hub->getEvent(&deviceId, &type, &scancode, &keycode,&flags, &value, &when);

调用的是 EventHub.cpp (frameworksaselibsui)中的:

bool EventHub::getEvent(int32_t* outDeviceId, int32_t* outType,

int32_t* outScancode, int32_t* outKeycode, uint32_t *outFlags,

int32_t* outValue, nsecs_t* outWhen)

在函数中调用了读设备操作:res = read(mFDs[i].fd, &iev, sizeof(iev));

在构造函数 WindowManagerService()调用 new KeyQ() 以后接着调用了:

mInputThread = new InputDispatcherThread();

...

mInputThread.start();

来启动一个线程 InputDispatcherThread

run()

process();

QueuedEvent ev = mQueue.getEvent(...)

因为WindowManagerService类中: final KeyQ mQueue;

所以实际上 InputDispatcherThread 线程实际上从 KeyQ 的事件队列中读取按键事件。

switch (ev.classType)

case RawInputEvent.CLASS_KEYBOARD:

...

dispatchKey((KeyEvent)ev.event, 0, 0);

mQueue.recycleEvent(ev);

break;

case RawInputEvent.CLASS_TOUCHSCREEN:

//Log.i(TAG, "Read next event " + ev);

dispatchPointer(ev, (MotionEvent)ev.event, 0, 0);

break;

KeyInputQueue.java (frameworksaseservicesjavacomandroidserver):

的线程 Thread mThread = new Thread("InputDeviceReader") 本地调用:

readEvent(ev);读取按键。readEvent 调用的是文件:

com_android_server_KeyInputQueue.cpp (frameworksaseservicesjni)中的函数:

static jboolean android_server_KeyInputQueue_readEvent(JNIEnv* env, jobject clazz,

jobject event)

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

Tags:Android 事件 处理

编辑录入:coldstar [复制链接] [打 印]
[]
  • 好
  • 好的评价 如果觉得好,就请您
      0%(0)
  • 差
  • 差的评价 如果觉得差,就请您
      0%(0)
赞助商链接