最近遇到了几次触摸屏局部无响应的问题,洒家一起整理记录一下下
局部点击无响应,系统报错Dropping event due to no window focus
ViewRootImpl[Launcher]: Dropping event due to no window focus: MotionEvent { action=ACTION_MOVE, actionButton=0, id[0]=0,
x[0]=0.4687214, y[0]=657.75525, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0,
pointerCount=1, historySize=0, eventTime=26636320, downTime=26463264, deviceId=2, source=0x1002 }
可以看到此次点击事件被系统抛弃了,一般这个事件抛弃是会发生在窗口切换注销的时候,但问题发生的时候不是这样的。
此时通过getevent却可以查看到点击触摸屏时发送的数据,数据如下
每次点击都会有数据,但是系统就是判定为异常数据,洒家也是第一次遇到触摸屏的问题,一脸懵逼
/dev/input/event3: EV_ABS ABS_MT_TRACKING_ID 0000001a
/dev/input/event3: EV_ABS ABS_MT_POSITION_X 00000886
/dev/input/event3: EV_ABS ABS_MT_POSITION_Y 000022f5
/dev/input/event3: EV_KEY BTN_TOUCH DOWN
/dev/input/event3: EV_ABS ABS_X 00000886
/dev/input/event3: EV_ABS ABS_Y 000022f5
/dev/input/event3: EV_SYN SYN_REPORT 00000000
/dev/input/event3: EV_ABS ABS_MT_TRACKING_ID ffffffff
/dev/input/event3: EV_KEY BTN_TOUCH UP
/dev/input/event3: EV_SYN SYN_REPORT 00000000`
这个是正常的单次点击事件,一次点击事件是由一个down,一个up与若干个move组成的,这是单指的点击事件,如果是多指的点击事件则会增加id与move
对比可以发现,触摸异常的时候,发送的数据仅有6位,缺失了up,down,abs_x,abs_y,系统需要up和down区分点击与放开事件,没有这两个值则导致判定为action_move,缺失了abs_x和abs_y导致系统计算为一个固定点,固定点上的Move是没有意义的,所以系统此次点击事件无效处理
顺便记录下触摸屏相关知识
单指按下事件
input_mt_slot(ts->pen_dev, id);
input_report_abs(ts->pen_dev, ABS_MT_TRACKING_ID, id);
input_report_abs(ts->pen_dev, ABS_MT_POSITION_X, x);
input_report_abs(ts->pen_dev, ABS_MT_POSITION_Y, y);
input_report_abs(ts->pen_dev, ABS_MT_PRESSURE, w);
input_report_abs(ts->pen_dev, ABS_MT_TOUCH_MAJOR, w);
input_sync(input);
单指松开
input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, -1);