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

Mah*_*rad 5 android scroll android-custom-view touch-event android-framelayout

我有一个扩展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; }
}
Run Code Online (Sandbox Code Playgroud)

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

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

    if (gestureDetector.onTouchEvent(event)) {
        return result;
    } else {
        return false;
    }       
}
Run Code Online (Sandbox Code Playgroud)

Tug*_*tes 2

onInterceptTouchEvent一旦返回,就不会再次调用运动序列true。事件随后被onTouchEvent直接发送(因为它们现在被子级拦截)。

您需要在这里进行两处更改:

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