Using onOverScrolled in ScrollView
android, scrollview
Solution
I have subclassed ScrollView to provided a more useful onOverScrolled. It looks like this:
public interface OnOverScrolledListener {
void onOverScrolled(android.widget.ScrollView scrollView,
int deltaX, int deltaY, boolean clampedX, boolean clampedY);
}
private OnOverScrolledListener mOnOverScrolledListener;
private int mOverScrollByDeltaX;
private int mOverScrollByDeltaY;
@Override protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {
this.mOverScrollByDeltaX = deltaX;
this.mOverScrollByDeltaY = deltaY;
final boolean result = super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent);
return result;
};
@Override
protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
if (mOnOverScrolledListener != null && (clampedX || clampedY)) {
mOnOverScrolledListener.onOverScrolled(this, mOverScrollByDeltaX, mOverScrollByDeltaY, clampedX, clampedY);
}
}
public OnOverScrolledListener getOnOverScrolledListener() {
return mOnOverScrolledListener;
}
public void setOnOverScrolledListener(OnOverScrolledListener onOverScrolledListener) {
this.mOnOverScrolledListener = onOverScrolledListener;
}
Problem
How do you exactly use `onOverScrolled` in `ScrollView`? ``` protected void onOverScrolled (int scrollX, int scrollY, boolean clampedX, boolean clampedY) ``` The `clampedX` and `clampedY` booleans do tell me if overscroll happened, but the scroll values say nothing about how much overscroll (they're always 0, or the maximum scroll). What's their point? Also, it gets called all the time. I expected it to be called only when one of the clamped values is true.