diff options
Diffstat (limited to 'WordPress/src/main/java/org/wordpress/android/widgets/WPScrollView.java')
-rw-r--r-- | WordPress/src/main/java/org/wordpress/android/widgets/WPScrollView.java | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/WordPress/src/main/java/org/wordpress/android/widgets/WPScrollView.java b/WordPress/src/main/java/org/wordpress/android/widgets/WPScrollView.java new file mode 100644 index 000000000..0133b6529 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/widgets/WPScrollView.java @@ -0,0 +1,80 @@ +package org.wordpress.android.widgets; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.widget.ScrollView; + +/** + * ScrollView which reports when user has scrolled up or down, and when scrolling has completed + */ +public class WPScrollView extends ScrollView { + + public interface ScrollDirectionListener { + void onScrollUp(float distanceY); + void onScrollDown(float distanceY); + void onScrollCompleted(); + } + + private ScrollDirectionListener mScrollDirectionListener; + private int mInitialScrollCheckY; + private static final int SCROLL_CHECK_DELAY = 250; + + public WPScrollView(Context context) { + this(context, null); + } + + public WPScrollView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public WPScrollView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + public void setScrollDirectionListener(ScrollDirectionListener listener) { + mScrollDirectionListener = listener; + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (mScrollDirectionListener != null + && event.getActionMasked() == MotionEvent.ACTION_MOVE + && event.getHistorySize() > 0) { + float initialY = event.getHistoricalY(event.getHistorySize() - 1); + float distanceY = initialY - event.getY(); + if (distanceY < 0) { + mScrollDirectionListener.onScrollUp(distanceY); + startScrollCheck(); + } else if (distanceY > 0) { + mScrollDirectionListener.onScrollDown(distanceY); + startScrollCheck(); + } + } + return super.onTouchEvent(event); + } + + private void startScrollCheck() { + mInitialScrollCheckY = getScrollY(); + post(mScrollTask); + } + + private final Runnable mScrollTask = new Runnable() { + @Override + public void run() { + if (mInitialScrollCheckY == getScrollY()) { + mScrollDirectionListener.onScrollCompleted(); + } else { + mInitialScrollCheckY = getScrollY(); + postDelayed(mScrollTask, SCROLL_CHECK_DELAY); + } + } + }; + + public boolean canScrollUp() { + return canScrollVertically(-1); + } + public boolean canScrollDown() { + return canScrollVertically(1); + } +} |