4

我有一个扩展FrameLayout的视图,需要通知其上的滚动事件。 该视图有一个实现GestureDetector的类的实例,该实例由被覆盖的onInterceptTouchEvent方法调用。Android手势检测器无法使用FrameLayout检测onScroll事件

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

您是否尝试从onDown()返回true? – devconsole 2012-02-10 15:53:59

+0

是的,但它永远不会到达onScroll(..) – Mahorad 2012-02-10 16:22:06

+0

对不起,我不能给你一个答案,但根据我的测试onInterceptTouchEvent并没有收到所有的触摸事件,但只有最初的下降事件。因此,手势检测器无法完成其工作。 (尝试添加调试输出到方法。)根据官方[文档](http://developer.android.com/reference/android/view/ViewGroup.html#onInterceptTouchEvent%28android.view.MotionEvent%29)一个有返回假以接收所有以下事件,但这似乎不是真的。 – devconsole 2012-02-11 00:25:05

回答

0

onInterceptTouchEvent不会再次呼吁运动序列一旦返回true。之后事件直接发送到onTouchEvent(因为他们现在正在被孩子拦截)。

这里您需要两个改变:

  • OnGestureListener.onDown()应该返回true这样,探测器能够处理像卷轴更复杂的手势
  • onInterceptTouchEvent应该总是返回false不断流向这种方法事件流