package com.external.HorizontalVariableListView.widget; abstract class IFlingRunnable implements Runnable { public static interface FlingRunnableView { boolean removeCallbacks(Runnable action); boolean post(Runnable action); void scrollIntoSlots(); void trackMotionScroll(int newX); int getMinX(); int getMaxX(); } protected int mLastFlingX; protected boolean mShouldStopFling; protected FlingRunnableView mParent; protected int mAnimationDuration; protected static final String LOG_TAG = "fling"; public IFlingRunnable( FlingRunnableView parent, int animationDuration ) { mParent = parent; mAnimationDuration = animationDuration; } public int getLastFlingX() { return mLastFlingX; } protected void startCommon() { mParent.removeCallbacks( this ); } public void stop( boolean scrollIntoSlots ) { mParent.removeCallbacks( this ); endFling( scrollIntoSlots ); } public void startUsingDistance( int initialX, int distance ) { if ( distance == 0 ) return; startCommon(); mLastFlingX = initialX; _startUsingDistance( mLastFlingX, distance ); mParent.post( this ); } public void startUsingVelocity( int initialX, int initialVelocity ) { if ( initialVelocity == 0 ) return; startCommon(); mLastFlingX = initialX; _startUsingVelocity( mLastFlingX, initialVelocity ); mParent.post( this ); } protected void endFling( boolean scrollIntoSlots ) { forceFinished( true ); mLastFlingX = 0; if ( scrollIntoSlots ) { mParent.scrollIntoSlots(); } } @Override public void run() { mShouldStopFling = false; final boolean more = computeScrollOffset(); int x = getCurrX(); mParent.trackMotionScroll( x ); if ( more && !mShouldStopFling ) { mLastFlingX = x; mParent.post( this ); } else { endFling( true ); } } public abstract boolean springBack( int startX, int startY, int minX, int maxX, int minY, int maxY ); protected abstract boolean computeScrollOffset(); protected abstract int getCurrX(); public abstract float getCurrVelocity(); protected abstract void forceFinished( boolean finished ); protected abstract void _startUsingVelocity( int initialX, int velocity ); protected abstract void _startUsingDistance( int initialX, int distance ); public abstract boolean isFinished(); }