5

我有一个扩展 FrameLayout 的视图,需要通知它上面的滚动事件。此视图有一个实现 GestureDetector 的类的实例,该实例由覆盖的 onInterceptTouchEvent 方法调用。

    private class HorizontalScrollListener implements OnGestureListener {
    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        ...
        return false;
    }
    @Override
    public boolean onDown(MotionEvent e) { 
         ...
         return false; 
    }
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
        return false;
    }
    @Override
    public void onLongPress(MotionEvent e) {
        ...
        System.out.println();
    }
    @Override
    public void onShowPress(MotionEvent e) {}
    @Override
    public boolean onSingleTapUp(MotionEvent e) { return false; }
}

唯一的问题是当我尝试滚动时可能会调用 onDown 和 onLongPress 方法,但实际的 onScroll 方法永远不会被调用。

    @Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    boolean result = super.onInterceptTouchEvent(event);

    if (gestureDetector.onTouchEvent(event)) {
        return result;
    } else {
        return false;
    }       
}
4

1 回答 1

1

onInterceptTouchEvent运动序列一旦返回就不会再次被调用true。事件被直接发送到onTouchEvent之后(因为它们现在被从孩子那里截获)。

您需要在此处进行两项更改:

  • OnGestureListener.onDown()应该返回true,以便检测器可以处理更复杂的手势,如滚动
  • onInterceptTouchEvent应始终返回false以保持事件流流向此方法
于 2017-12-01T10:32:24.603 回答