onInterceptTouchEvent永远不会收到action_move

2024-01-03

我有一个自定义 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;
  }

除了 ACTION_MOVE 中的一种情况外,我还有返回 false 的 onTouch 代码;然而,它仅在 ACTION_DOWN 被调用时被调用;因此它只返回 false。


实际情况比这要复杂一些。首先你需要重写onTouchEvent()并处理ACTION_DOWN and MOVE那里也有活动。然后就会发生下面的情况。

  1. ACTION_DOWN事件被发送到onInterceptTouchEvent()第一的。你应该回来false从那里。
  2. Now there are two cases:
    • 如果下方没有可触摸的视野ACTION_DONW事件在视图树中的位置,然后ACTION_DOWN事件和所有后续事件都被分派到onTouchEvent()。你必须返回true从那里。只有这样您才会收到发送至的后续事件onTouchEvent()方法。与您是否返回无关true or false, onInterceptTouchEvent()将不再收到任何后续事件。
    • 如果存在可触摸视图,则所有事件将被分派到onInterceptTouchEvent()(包括ACTION_MOVE事件)。你需要返回true在您检测到您的手势后,从那里开始。一旦你回来true从这里开始,可触摸视图将收到ACTION_CANCEL事件和所有进一步的事件将被发送到onTouchEvent() method.

希望这可以帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

onInterceptTouchEvent永远不会收到action_move 的相关文章

随机推荐