ACTION_HOVER_ENTER 事件重复之前的坐标

ACTION_HOVER_ENTER event repeats previous coordinates

我有一个覆盖 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

这是辅助功能如何使用悬停事件的特征吗?有什么办法可以避免这种行为吗?

只能在模拟器上测试。

这些事件的报告位置来自系统,这似乎是不可避免的。我处理这些悬停事件的代码不够健壮,无法处理它们。解决方案是让它能够处理这些报告以前的旧位置的悬停输入事件。