aboutsummaryrefslogtreecommitdiff
path: root/WordPress/src/main/java/org/wordpress/android/widgets/WPScrollView.java
diff options
context:
space:
mode:
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.java80
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);
+ }
+}