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

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

 2010-08-22 04:56:00 来源:WEB开发网   
核心提示:android_server_KeyInputQueue_readEvent中有:hub = new EventHub;bool res = hub->getEvent(&deviceId, &type, &scancode, &keycode,&flags, &value, &when);hub->get

android_server_KeyInputQueue_readEvent中有:

hub = new EventHub;

bool res = hub->getEvent(&deviceId, &type, &scancode, &keycode,

&flags, &value, &when);

hub->getEvent 调用的是

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)

读取按键。

class RefBase::weakref_impl : public RefBase::weakref_type

在系统启动后,android 会通过

static const char *device_path = "/dev/input";

bool EventHub::openPlatformInput(void)

res = scan_dir(device_path);

通过下面的函数打开设备。

int EventHub::open_device(const char *deviceName)

{

...

fd = open(deviceName, O_RDWR);

...

mFDs[mFDCount].fd = fd;

mFDs[mFDCount].events = POLLIN;

...

ioctl(mFDs[mFDCount].fd, EVIOCGNAME(sizeof(devname)-1), devname);

...

const char* root = getenv("ANDROID_ROOT");

snprintf(keylayoutFilename, sizeof(keylayoutFilename),

"%s/usr/keylayout/%s.kl", root, tmpfn);

...

device->layoutMap->load(keylayoutFilename);

...

}

打开设备的时候,如果 device->classes&CLASS_KEYBOARD 不等于 0 表明是键盘。

常用输入设备的定义有:

enum {

CLASS_KEYBOARD = 0x00000001, //键盘

CLASS_ALPHAKEY = 0x00000002, //

CLASS_TOUCHSCREEN = 0x00000004, //触摸屏

CLASS_TRACKBALL = 0x00000008 //轨迹球

};

打开键盘设备的时候通过上面的 ioctl 获得设备名称,命令字 EVIOCGNAME 的定义在文件:

kernel/include/linux/input.h 中。

#define EVIOCGNAME(len) _IOC(_IOC_READ, 'E', 0x06, len) /* get device name

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

Tags:Android 事件 处理

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