J'ai commencé avec le code de HighFlyer qui a en effet changé le champ mScroller (ce qui est un bon début) mais n'a pas aidé à prolonger la durée du défilement car ViewPager transmet explicitement la durée au mScroller lors de la demande de défilement.
L'extension de ViewPager ne fonctionnait pas car la méthode importante (smoothScrollTo) ne peut pas être remplacée.
J'ai fini par résoudre ce problème en étendant Scroller avec ce code:
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);
}
}
Et en l'utilisant comme ceci:
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) {
}
J'ai fondamentalement codé la durée à 5 secondes et j'ai fait en sorte que mon ViewPager l'utilise.
J'espère que cela t'aides.