Android GestureDetector无法检测FrameLayout上的onScroll事件

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;
    }       
}

你尝试在onDown()函数中返回true了吗? - devconsole
是的,但它从未到达onScroll(..)。 - Mahorad
抱歉,我无法给您答案,但根据我的测试,onInterceptTouchEvent并不会接收所有的触摸事件,而只有最初的按下事件。因此GestureDetector无法正常工作。(尝试在该方法中添加调试输出。)根据官方文档(http://developer.android.com/reference/android/view/ViewGroup.html#onInterceptTouchEvent%28android.view.MotionEvent%29),必须返回false才能接收所有后续事件,但这似乎并不正确。 - devconsole
1个回答

2

onInterceptTouchEvent方法返回true后,对于一个手势序列,它不会再次被调用。此时事件将直接发送到onTouchEvent方法中(因为这些事件现在是从子视图中拦截来的)。

在这里需要进行两个更改:

  • OnGestureListener.onDown()应该返回true,以便检测器可以处理更复杂的手势,如滚动
  • onInterceptTouchEvent应该始终返回false,以保持事件流向onTouchEvent方法

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接