2014-02-11 6 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

Смежные вопросы