Android GestureDetector无法使用FrameLayout检测onScroll事件

时间:2012-02-10 15:50:21

标签: android scroll ontouchevent android-custom-view android-framelayout

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

一旦运动序列返回onInterceptTouchEvent

true就不再被调用。之后事件会直接发送到onTouchEvent(因为它们现在正被儿童截获)。

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

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