Android 模拟多点触摸事件(单指线性滑动)
我正在对使用的驱动程序文件进行编辑。 我的目标是绑定一个从(x1,y1)到(x2,y2)的沿线滑动手势 为此,我在钥匙压力检测功能内执行此功能:Android 模拟多点触摸事件(单指线性滑动),android,c,linux-kernel,linux-device-driver,Android,C,Linux Kernel,Linux Device Driver,我正在对使用的驱动程序文件进行编辑。 我的目标是绑定一个从(x1,y1)到(x2,y2)的沿线滑动手势 为此,我在钥匙压力检测功能内执行此功能: static void do_swipe(struct kp *kp, long xstart, long ystart, long xend, long yend, int id) { printk("SWIPE! X1 %d Y1 %d X2 %d Y2 %d ID %d \n",xstart,ystart,xend,yen
static void do_swipe(struct kp *kp, long xstart, long ystart, long xend, long yend,
int id) {
printk("SWIPE! X1 %d Y1 %d X2 %d Y2 %d ID %d \n",xstart,ystart,xend,yend,id);
int sx, sy;
int dx = abs(xend - xstart);
int dy = abs(yend - ystart);
if (xstart < xend)
sx = 1;
else
sx = -1;
if (ystart < yend)
sy = 1;
else
sy = -1;
int err = dx - dy;
long tempx = xstart;
long tempy = ystart;
while (1) {
key_report(kp, tempx, tempy, id);
//Touch is now detected with input_sync
input_sync(kp->input);
if(tempx == xend && tempy == yend) break;
int e2 = 2 * err;
if (e2 > (-1)*dy) {
err = err - dy;
tempx = tempx + sx;
} else if (e2 < dx) {
err = err + dx;
tempy = tempy + sy;
}
}
printk("END! X %d Y %d \n",tempx, tempy);
}
其中kp->input是这样定义的
struct input_dev *input;
编辑:我更新了代码,还附加了按键压力的通用代码,因为我希望驾驶员只对每个按键压力执行一次刷卡,以避免刷卡循环
static void kp_work(struct kp *kp) {
int i, code, value;
kp_search_key(kp);
if (key_param[0] == 3) {
if (kp->key_valid[4] == 1) {
value = kp->key_value[4];
kp->flagchan4 = 0;
if (value >= 0 && value <= (9 + 40)) {
if (key_param[99] == 1 ) {
do_swipe(kp, key_param[25], key_param[26], key_param[97],
key_param[98], 12);
} else
key_report(kp, key_param[25], key_param[26], 12);
} else if (value >= 392 - 40 && value <= (392 + 40)) {
if (key_param[102] == 1) {
do_swipe(kp, key_param[23], key_param[24], key_param[100],
key_param[101], 12);
} else
key_report(kp, key_param[23], key_param[24], 12);
}
kp->flagchan4 = 0;
} else {
kp->flagchan4 = 1;
}
}
input_sync(kp->input);
}
静态无效kp\u工作(结构kp*kp){
int i,代码,值;
kp搜索密钥(kp);
如果(键参数[0]==3){
如果(kp->key_valid[4]==1){
value=kp->key_value[4];
kp->flagchan4=0;
如果(值>=0&&value=392-40&&value标志通道4=0;
}否则{
kp->flagchan4=1;
}
}
输入同步(kp->输入);
}
也许我可以在kp->flagchan4上设置一个检查。。。
编辑:在flagchan4上设置一个检查就成功了。就像在中一样,似乎说您需要一个最终的
输入\u sync()
将其清除。您也可以尝试将代码放入工作队列
,我不知道事件系统是否被值淹没。@artlessnoise您给了我正确的提示,现在我在每个键报告
后立即输入同步。现在触摸事件会显示在屏幕上,但如果我一直按该键,则swipe继续,如何实施“锁定”密钥的策略,使其只执行一次刷卡?@artlessnoise driver正在工作,这要感谢您的提示。如果您想创建一个答案,我会接受它。创建一个社区wiki答案并接受它是很好的;如果您真的渴望积分,您也可以创建自己的答案。我会将您的标题更新为“模拟多点触控事件”。我认为这更好地描述了正在发生的事情。如果我编辑一个问题并改变其含义,一群非内核开发人员会拒绝它。
static void kp_work(struct kp *kp) {
int i, code, value;
kp_search_key(kp);
if (key_param[0] == 3) {
if (kp->key_valid[4] == 1) {
value = kp->key_value[4];
kp->flagchan4 = 0;
if (value >= 0 && value <= (9 + 40)) {
if (key_param[99] == 1 ) {
do_swipe(kp, key_param[25], key_param[26], key_param[97],
key_param[98], 12);
} else
key_report(kp, key_param[25], key_param[26], 12);
} else if (value >= 392 - 40 && value <= (392 + 40)) {
if (key_param[102] == 1) {
do_swipe(kp, key_param[23], key_param[24], key_param[100],
key_param[101], 12);
} else
key_report(kp, key_param[23], key_param[24], 12);
}
kp->flagchan4 = 0;
} else {
kp->flagchan4 = 1;
}
}
input_sync(kp->input);
}