android - onInterceptTouchEvent 从不接收 action_move

标签 android motionevent

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

ViewGroup 包含两个 View ,一个 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_DOWNMOVE 事件。然后会发生以下情况。

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

希望这对您有所帮助。

关于android - onInterceptTouchEvent 从不接收 action_move,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23725102/

相关文章:

android - 错误 :Unable to resolve dependency for ':app@debug/compileClasspath' : Could not resolve com. android.support :appcompat-v7:26. 0.0-beta1

java - Android Bottomsheet对话框如何设置下边距

java - ImageView onClickListener()

java - 获取ActionEvent的坐标

java - MotionEvents 未触发

java - Android服务占用大量内存

android - UTC 时间不匹配 - Java 与 Node JS 上的 Moment

android - 为什么 Android MotionEvent.getHistoricalX 抛出异常

android - 使用 ACTION_MOVE 拖动对象

android - 是什么导致了 Android 中的 MotionEvent.ACTION_CANCEL?