Ho iniziato con il codice di HighFlyer che ha effettivamente cambiato il campo mScroller (che è un ottimo inizio) ma non ha aiutato a estendere la durata dello scorrimento perché ViewPager passa esplicitamente la durata a mScroller quando richiede di scorrere.
L'estensione di ViewPager non ha funzionato poiché il metodo importante (smoothScrollTo) non può essere ignorato.
Ho finito per risolvere questo problema estendendo Scroller con questo codice:
public class FixedSpeedScroller extends Scroller {
private int mDuration = 5000;
public FixedSpeedScroller(Context context) {
super(context);
}
public FixedSpeedScroller(Context context, Interpolator interpolator) {
super(context, interpolator);
}
public FixedSpeedScroller(Context context, Interpolator interpolator, boolean flywheel) {
super(context, interpolator, flywheel);
}
@Override
public void startScroll(int startX, int startY, int dx, int dy, int duration) {
// Ignore received duration, use fixed one instead
super.startScroll(startX, startY, dx, dy, mDuration);
}
@Override
public void startScroll(int startX, int startY, int dx, int dy) {
// Ignore received duration, use fixed one instead
super.startScroll(startX, startY, dx, dy, mDuration);
}
}
E usandolo in questo modo:
try {
Field mScroller;
mScroller = ViewPager.class.getDeclaredField("mScroller");
mScroller.setAccessible(true);
FixedSpeedScroller scroller = new FixedSpeedScroller(mPager.getContext(), sInterpolator);
// scroller.setFixedDuration(5000);
mScroller.set(mPager, scroller);
} catch (NoSuchFieldException e) {
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
}
Fondamentalmente ho codificato la durata a 5 secondi e l'ho fatto utilizzare dal mio ViewPager.
Spero che questo ti aiuti.