我正在用我自己的程序在Android上处理输入事件,没有EventHub和InputReader,代码在单点触摸屏上工作,而不能在多点触摸屏上工作,下面是我的代码(部分):
int readSize = read(mInputTouchfd, mEventData, EVS_READ_EVENT_MAX_NUM * sizeof(struct input_event));
if (readSize >= (int)sizeof(struct input_event))
{
int eventNum = readSize / sizeof(struct input_event);
LOG1("HandleTouchEvent has read %d input event", eventNum);
for (int i = 0; i < eventNum; i++)
{
LOG1("number %d event,details:type:[0x%X] code:[0x%X (%d)] value:[0x%X]", i, mEventData[i].type, mEventData[i].code, mEventData[i].code, mEventData[i].value);
if (mEventData[i].type == EV_ABS && mEventData[i].code == ABS_MT_POSITION_X)
{
realx = mEventData[i].value;
}
else if (mEventData[i].type == EV_ABS && mEventData[i].code == ABS_MT_POSITION_Y)
{
realy = mEventData[i].value;
}
else if (mEventData[i].type == EV_KEY && mEventData[i].code == BTN_TOUCH)
{
if (mEventData[i].value == TOUCH_EVENT_DOWN)
{
buttonEvent = TOUCH_EVENT_DOWN;
}
else if (mEventData[i].value == TOUCH_EVENT_UP)
{
buttonEvent = TOUCH_EVENT_UP;
}
}
else if (mEventData[i].type == EV_SYN && mEventData[i].code == SYN_REPORT)
{
LOG1("parse Event succeed:Event[%s],x[%d],y[%d]", toString(buttonEvent), realx, realy);
if (spHomePage)
{
spHomePage->dispatchTouchEvent(buttonEvent, realx, realy);
}
// reset event type after handle finished
buttonEvent = TOUCH_EVENT_MOVE;
}
}
}
我发现多点触摸屏的事件代码,类型和值都不一样,我使用getevent
命令来捕获这样的事件:
/dev/input/event0: EV_KEY BTN_TOUCH UP
/dev/input/event0: EV_MSC MSC_TIMESTAMP 00032c80
/dev/input/event0: EV_SYN SYN_REPORT 00000000
/dev/input/event0: EV_ABS ABS_MT_TRACKING_ID 0000004d
/dev/input/event0: EV_ABS ABS_MT_POSITION_X 00003dad
/dev/input/event0: EV_ABS ABS_MT_POSITION_Y 000012bc
/dev/input/event0: EV_KEY BTN_TOUCH DOWN
/dev/input/event0: EV_ABS ABS_X 00003dad
/dev/input/event0: EV_ABS ABS_Y 000012bc
/dev/input/event0: EV_MSC MSC_TIMESTAMP 00034bc0
/dev/input/event0: EV_SYN SYN_REPORT 00000000
/dev/input/event0: EV_MSC MSC_TIMESTAMP 00036b00
当code=EV_ABS,type=ABS_MT_POSITION_X,值是00003 dad(十六进制),等于15789(十进制),这比1920大得多(我的触摸屏是10英寸,16:9和1080 p,),我很困惑我怎么能得到准确的坐标(包括x和y)?我认为值的单位是像素,但似乎不是,有人可以帮助我吗?
我已经搜索了ChatGPT/谷歌巴德,而我得到了错误的答案。
1条答案
按热度按时间68de4m5k1#
最后我找到了这个问题的答案,在Android中我们可以使用
getevent
来获取包括X/Y间隔在内的输入协议细节,例如:这里我们得到了X值区间:0-16384,Y值区间:0-9600;我们得到了这样的事件(也是我们的
getevent
命令):这里我们得到x(ABS_MT_POSITION_X)= 2 e95(HEX),等于11925(DEC),我们转换为像素(我的屏幕是1920*1080):