2012-03-23 44 views
6

我有一個ViewPager,它使用GridView作爲頁面。當我滑過屏幕時,我希望ViewPager切換頁面。正確檢測Android中ViewPager中放置的GridView上的滑動操作

問題是當跨越GridView製作滑動時沒有檢測到滑動。在GridView之外,滑動操作正確;看起來GridView捕獲所有觸摸事件而不先傳遞給ViewPager。

雖然與源代碼擺弄,我這樣做是爲了從GridView控件擴展的自定義類:

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    return pager.onInterceptTouchEvent(event); 
} 

- 在pager指ViewPager類。有了這個,ViewPager將正確地檢測滑動並相應地移動頁面,但它不允許GridView接受任何事件,所以我不能點擊這些項目。

我希望能夠正確檢測到ViewPager中的滑動和GridView上的項目點擊。

+0

你有沒有解決這個問題的方法? – Praneeth 2016-02-17 14:07:12

回答

1

您可以覆蓋onInterceptTouchEvent在您想

2

阿利克斯是在正確的軌道上調度evenement。我設法提出了這個簡單的解決方案。我不完全確定它是如何工作的,但它確實如此!並且爲了將來的參考,它也適用於其他類型的視圖 - 例如TableLayout - 不僅僅是GridView。

@Override 
public boolean onInterceptTouchEvent(MotionEvent event) { 
    x = event.getX(); 
    y = event.getY(); 
    switch (event.getActionMasked()) { 
    case MotionEvent.ACTION_DOWN: { 
     downX = x; 
     downY = y; 
     return super.onInterceptTouchEvent(event); 
    } 
    case MotionEvent.ACTION_MOVE: { 
     deltaX = Math.abs(downX - x); 
     deltaY = Math.abs(downY - y); 
     return super.onTouchEvent(event); 
    } 
    case MotionEvent.ACTION_UP: { 
     if (deltaX > 4 && deltaY > 4) { 
      super.onTouchEvent(event); 
     } 
    } 
    } 
    return super.onInterceptTouchEvent(event); 
} 
+0

這是工作,完美,thnx。請將答案標記爲已解決。 – olegflo 2015-02-23 16:39:15

+0

對我來說它只是在向上移動!向下移動不起作用 – Praneeth 2016-02-18 04:24:04

+0

這適用於我,但我無法點擊網格物品。任何建議? – AndroGeek 2017-02-16 11:23:58

6

我曾與colig的實施麻煩,但我能得到它通過繼承ViewPager並重寫onInterceptTouchEvent()方法來工作。我只檢查了X方向的滑動操作,以便在需要時進行垂直滾動。

private static final int minSwipeDistance = 30; 
private float mTouchX; 

@Override 
public boolean onInterceptTouchEvent(MotionEvent event) { 
    boolean response = super.onInterceptTouchEvent(event); 
    float x = event.getX(); 
    switch (event.getActionMasked()) { 
    case MotionEvent.ACTION_DOWN: 
     mTouchX = x; 
     break; 
    case MotionEvent.ACTION_MOVE: 
     float dX = Math.abs(x - mTouchX); 
     if (dX > minSwipeDistance) 
      return true; 
     break; 
    } 
    return response; 
}