首页 文章

onInterceptTouchEvent永远不会收到action_move

提问于
浏览
5

我有一个自定义ViewGroup覆盖onInterceptTouchEvent() . 它接收ACTION_DOWN但从未收到ACTION_MOVE . 我的理解是,除非它返回“true”,否则它应该接收所有MotionEvent .

ViewGroup包含两个视图,一个ImageView和一个GridLayout .

我的拦截代码是:

@Override
  public boolean onInterceptTouchEvent(MotionEvent ev)
  {
    final int action = ev.getAction();
    switch (action & MotionEvent.ACTION_MASK)
    {
      case MotionEvent.ACTION_DOWN:
        logD ("DDV Intercept DOWN");
        break;
      case MotionEvent.ACTION_POINTER_DOWN:
        logD ("DDV Intercept P DOWN"); // logD: shell around Log.d()
        break;
      case MotionEvent.ACTION_MOVE:
        logD ("DDV Intercept MOVE");
        break;
      case MotionEvent.ACTION_UP:
        logD ("DDV Intercept UP");
        break;
      case MotionEvent.ACTION_POINTER_UP:
        logD ("DDV Intercept P UP " + ev.getActionIndex());
        break;
      case MotionEvent.ACTION_CANCEL: 
        logD ("DDV Intercept CANCEL");
        break;
      default:
        logD ("DDV Intercept " + (action & MotionEvent.ACTION_MASK));
    }        
    return false;
  }

我还有onTouch的代码,除了ACTION_MOVE中的一个案例外,它返回false;但是,只调用ACTION_DOWN调用它;因此它只会返回错误 .

1 回答

  • 18

    它有点复杂 . 首先,您需要覆盖 onTouchEvent() 并在那里处理 ACTION_DOWNMOVE 事件 . 然后会发生以下情况 .

    • ACTION_DOWN 事件首先被调度到 onInterceptTouchEvent() . 你应该从那里返回 false .

    • 现在有两种情况:

    • 如果视图树中 ACTION_DONW 事件位置下方没有可触摸视图,则 ACTION_DOWN 事件和所有后续事件将被分派到 onTouchEvent() . 你必须从那里返回 true . 只有这样,您才会收到发送到 onTouchEvent() 方法的后续事件 . 无论您是返回 true 还是 falseonInterceptTouchEvent() 将不再接收任何后续事件 .

    • 如果有可触摸视图,则所有事件将被分派到 onInterceptTouchEvent() (包括 ACTION_MOVE 事件) . 在检测到手势后,您需要从那里返回 true . 从此处返回 true 后,可触摸视图将收到 ACTION_CANCEL 事件,并且所有其他事件将被分派到 onTouchEvent() 方法 .

    希望这可以帮助 .

相关问题