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

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

 2010-08-22 04:56:00 来源:WEB开发网   
核心提示:android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_DISPLAY);try {RawInputEvent ev = new RawInputEvent();while (true) {InputDevice di

android.os.Process.setThreadPriority(

android.os.Process.THREAD_PRIORITY_URGENT_DISPLAY);

try {

RawInputEvent ev = new RawInputEvent();

while (true) {

InputDevice di;

readEvent(ev);

send = preprocessEvent(di, ev);

addLocked(di, curTime, ev.flags, ..., me);

}

}

};

输入事件分发线程

在frameworks/base/services/java/com/android/server/WindowManagerService.java里创建了一个输入事件分发线程,它负责把事件分发到相应的窗口上去。

Java代码

mQueue.getEvent

dispatchKey/dispatchPointer/dispatchTrackball

mQueue.getEvent

dispatchKey/dispatchPointer/dispatchTrackball

按键,触摸屏流程分析

按键触摸屏流程分析:

WindowManagerService类的构造函数

WindowManagerService()

mQueue = new KeyQ();

因为 WindowManagerService.java (frameworksaseservicesjavacomandroidserver)中有:

private class KeyQ extends KeyInputQueue

KeyQ 是抽象类 KeyInputQueue 的实现,所以 new KeyQ类的时候实际上在 KeyInputQueue 类中创建了

一个线程 InputDeviceReader 专门用来冲设备读取按键事件,代码:

Thread mThread = new Thread("InputDeviceReader") {

public void run()

{

在循环中调用:readEvent(ev);

...

send = preprocessEvent(di, ev);

实际调用的是 KeyQ 类的 preprocessEvent 函数

...

int keycode = rotateKeyCodeLocked(ev.keycode);

int[] map = mKeyRotationMap;

for (int i=0; i

{

if (map[i] == keyCode)

return map[i+1];

} //

addLocked(di, curTime, ev.flags,RawInputEvent.CLASS_KEYBOARD,newKeyEvent(di, di.mDownTime, curTime, down,keycode, 0, scancode,...));

QueuedEvent ev = obtainLocked(device, when, flags, classType, event);

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

Tags:Android 事件 处理

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