2012-02-10 143 views
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不斷流向這種方法事件流