WEB开发网
开发学院手机开发Android 开发 Android 输入事件流程 阅读

Android 输入事件流程

 2010-05-24 21:08:00 来源:WEB开发网   
核心提示:if (pollres <= 0) {if (errno != EINTR) {LOGW("select failed (errno=%d)", errno);usleep(100000);}continue;}for(i = 1; i < mFDCount; i++) {if(mFDs

if (pollres <= 0) {

if (errno != EINTR) {

LOGW("select failed (errno=%d) ", errno);

usleep(100000);

}

continue;

}

for(i = 1; i < mFDCount; i++) {

if(mFDs[i].revents) {

LOGV("revents for %d = 0x%08x", i, mFDs[i].revents);

if(mFDs[i].revents & POLLIN) {

res = read(mFDs[i].fd, &iev, sizeof(iev));

if (res == sizeof(iev)) {

LOGV("%s got: t0=%d, t1=%d, type=%d, code=%d, v=%d",

mDevices[i]->path.string(),

(int) iev.time.tv_sec, (int) iev.time.tv_usec,

iev.type, iev.code, iev.value);

*outDeviceId = mDevices[i]->id;

if (*outDeviceId == mFirstKeyboardId) *outDeviceId = 0;

*outType = iev.type;

*outScancode = iev.code;

if (iev.type == EV_KEY) {

err = mDevices[i]->layoutMap->map(iev.code, outKeycode, outFlags);

LOGV("iev.code=%d outKeycode=%d outFlags=0x%08x err=%d ",

iev.code, *outKeycode, *outFlags, err);

if (err != 0) {

*outKeycode = 0;

*outFlags = 0;

}

} else {

*outKeycode = iev.code;

}

*outValue = iev.value;

*outWhen = s2ns(iev.time.tv_sec) + us2ns(iev.time.tv_usec);

return true;

} else {

if (res<0) {

LOGW("could not get event (errno=%d)", errno);

} else {

LOGE("could not get event (wrong size: %d)", res);

}

continue;

}

}

}

}

...

}

对于按键事件,调用mDevices->layoutMap->map 进行映射。映射实际是由 KeyLayoutMap::map完成的,KeyLayoutMap类里读取配置文件qwerty.kl,由配置文件 qwerty.kl 决定键值的映射关系。你可以通过修改./development/emulator/keymaps/qwerty.kl来改变键值的映射关系。

上一页  1 2 3 4  下一页

Tags:Android 输入 事件

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