我有一个覆盖dispatchHoverEvent()的自定义视图,因此它可以实现对talkBack功能的一些支持,它有以下代码用于测试:
int action = event.getActionMasked();
switch (action) {
case MotionEvent.ACTION_HOVER_ENTER: {
Log.d("dispatchHoverEvent", "ACTION_HOVER_ENTER x=" + x + " y=" + y);
break;
}
case MotionEvent.ACTION_HOVER_MOVE: {
Log.d("dispatchHoverEvent", "ACTION_HOVER_MOVE x=" + x + " y=" + y);
break;
}
case MotionEvent.ACTION_HOVER_EXIT: {
Log.d("dispatchHoverEvent", "ACTION_HOVER_EXIT x=" + x + " y=" + y);
break;
}
}
两次手势后的输出是(删除了一些ACTION_HOVER_MOVE日志输出):
D/dispatchHoverEvent: ACTION_HOVER_ENTER x=73.03711 y=413.70703
D/dispatchHoverEvent: ACTION_HOVER_MOVE x=79.0686 y=412.71094
D/dispatchHoverEvent: ACTION_HOVER_MOVE x=85.06714 y=412.71094
D/dispatchHoverEvent: ACTION_HOVER_MOVE x=93.07617 y=412.71094
D/dispatchHoverEvent: ACTION_HOVER_MOVE x=103.062744 y=412.71094
...
...
D/dispatchHoverEvent: ACTION_HOVER_MOVE x=203.15918 y=416.6953
D/dispatchHoverEvent: ACTION_HOVER_EXIT x=203.15918 y=416.6953
D/dispatchHoverEvent: ACTION_HOVER_ENTER x=73.03711 y=412.71094
D/dispatchHoverEvent: ACTION_HOVER_MOVE x=643.5571 y=413.70703
D/dispatchHoverEvent: ACTION_HOVER_EXIT x=643.5571 y=413.70703
问题是ACTION_HOVER_ENTER事件,特别是以下在移动和退出事件后输入事件。在api24 +第二个悬停输入事件似乎重复上一个悬停输入事件的坐标(如果初始输入事件保持几秒钟)。有时它具有相同的x,y值或只有其中一个,但实际的输入事件不接近任一坐标值。这使我无法处理自定义视图的辅助功能事件。
如果有悬停事件没有ACTION_HOVER_MOVE,则会给出预测的行为:
D/dispatchHoverEvent: ACTION_HOVER_ENTER x=98.08594 y=424.72266
D/dispatchHoverEvent: ACTION_HOVER_EXIT x=98.08594 y=424.72266
D/dispatchHoverEvent: ACTION_HOVER_ENTER x=442.3755 y=428.70703
D/dispatchHoverEvent: ACTION_HOVER_EXIT x=442.3755 y=428.70703
这是可访问性如何使用悬停事件的特征吗?有没有办法避免这种行为?
只能在模拟器上测试它。
答案 0 :(得分:0)
这些事件的报告位置来自系统,似乎不可避免。我处理这些悬停事件的代码不够强大,无法处理它们。解决方案是让它能够处理这些悬停输入报告上一个旧位置的事件。