2014-02-11 16 views

回答

4

this snippet我写的。它可以计算它滚动的像素有多远,并可以听滚动更改。

/** 
* Created by mariotaku on 14/10/22. 
*/ 
public class ListScrollDistanceCalculator implements OnScrollListener { 

    private ScrollDistanceListener mScrollDistanceListener; 

    private boolean mListScrollStarted; 
    private int mFirstVisibleItem; 
    private int mFirstVisibleHeight; 
    private int mFirstVisibleTop, mFirstVisibleBottom; 
    private int mTotalScrollDistance; 

    @Override 
    public void onScrollStateChanged(AbsListView view, int scrollState) { 
     if (view.getCount() == 0) return; 
     switch (scrollState) { 
      case SCROLL_STATE_IDLE: { 
       mListScrollStarted = false; 
       break; 
      } 
      case SCROLL_STATE_TOUCH_SCROLL: { 
       final View firstChild = view.getChildAt(0); 
       mFirstVisibleItem = view.getFirstVisiblePosition(); 
       mFirstVisibleTop = firstChild.getTop(); 
       mFirstVisibleBottom = firstChild.getBottom(); 
       mFirstVisibleHeight = firstChild.getHeight(); 
       mListScrollStarted = true; 
       mTotalScrollDistance = 0; 
       break; 
      } 
     } 
    } 

    public int getTotalScrollDistance() { 
     return mTotalScrollDistance; 
    } 

    @Override 
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
     if (totalItemCount == 0 || !mListScrollStarted) return; 
     final View firstChild = view.getChildAt(0); 
     final int firstVisibleTop = firstChild.getTop(), firstVisibleBottom = firstChild.getBottom(); 
     final int firstVisibleHeight = firstChild.getHeight(); 
     final int delta; 
     if (firstVisibleItem > mFirstVisibleItem) { 
      mFirstVisibleTop += mFirstVisibleHeight; 
      delta = firstVisibleTop - mFirstVisibleTop; 
     } else if (firstVisibleItem < mFirstVisibleItem) { 
      mFirstVisibleBottom -= mFirstVisibleHeight; 
      delta = firstVisibleBottom - mFirstVisibleBottom; 
     } else { 
      delta = firstVisibleBottom - mFirstVisibleBottom; 
     } 
     mTotalScrollDistance += delta; 
     if (mScrollDistanceListener != null) { 
      mScrollDistanceListener.onScrollDistanceChanged(delta, mTotalScrollDistance); 
     } 
     mFirstVisibleTop = firstVisibleTop; 
     mFirstVisibleBottom = firstVisibleBottom; 
     mFirstVisibleHeight = firstVisibleHeight; 
     mFirstVisibleItem = firstVisibleItem; 
    } 

    public void setScrollDistanceListener(ScrollDistanceListener listener) { 
     mScrollDistanceListener = listener; 
    } 

    public static interface ScrollDistanceListener { 
     void onScrollDistanceChanged(int delta, int total); 
    } 
} 
+0

真的很有帮助谢谢 – hister

+1

我见过的最好的解决方案。谢谢! – armansimonyan13

+0

只能在我的滚动视图上使用,还是可以在任何滚动视图上检测? – Tomi