onInterceptTouchEvent永远不会收到action_move

时间:2014-05-18 17:54:37

标签: android motionevent

我有一个自定义的ViewGroup,其覆盖了onInterceptTouchEvent()。它接收ACTION_DOWN但从未收到ACTION_MOVE。我的理解是,除非它返回" true",它应该接收所有MotionEvents。

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 个答案:

答案 0 :(得分:20)

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

  1. ACTION_DOWN事件首先被调度到onInterceptTouchEvent()。你应该从那里返回false
  2. 现在有两种情况:
    • 如果视图树中ACTION_DONW事件的位置下方没有可触摸视图,则会将ACTION_DOWN事件和所有后续事件分派到onTouchEvent()。您必须从那里返回true。只有这样,您才会收到发送到onTouchEvent()方法的后续活动。无论您是返回true还是falseonInterceptTouchEvent()都不会再收到任何跟进事件。
    • 如果存在可触摸视图,则会将所有事件分派到onInterceptTouchEvent()(包括ACTION_MOVE个事件)。在检测到手势后,您需要从那里返回true。从此处返回true后,可触摸视图将收到ACTION_CANCEL个事件,并且所有其他事件将被调度到onTouchEvent()方法。
  3. 希望这有帮助。