We can extend the Scroller class then intercept corresponding animation start methods to mark that was started, after computeScrollOffset() return false which means animation finished's value, we inform by a Listener to caller :
public class ScrollerImpl extends Scroller { ...Constructor... private boolean mIsStarted; private OnFinishListener mOnFinishListener; @Override public boolean computeScrollOffset() { boolean result = super.computeScrollOffset(); if (!result && mIsStarted) { try { // Don't let any exception impact the scroll animation. mOnFinishListener.onFinish(); } catch (Exception e) {} mIsStarted = false; } return result; } @Override public void startScroll(int startX, int startY, int dx, int dy) { super.startScroll(startX, startY, dx, dy); mIsStarted = true; } @Override public void startScroll(int startX, int startY, int dx, int dy, int duration) { super.startScroll(startX, startY, dx, dy, duration); mIsStarted = true; } @Override public void fling(int startX, int startY, int velocityX, int velocityY, int minX, int maxX, int minY, int maxY) { super.fling(startX, startY, velocityX, velocityY, minX, maxX, minY, maxY); mIsStarted = true; } public void setOnFinishListener(OnFinishListener onFinishListener) { mOnFinishListener = onFinishListener; } public static interface OnFinishListener { void onFinish(); } }