Zacząłem od kodu HighFlyer, który rzeczywiście zmienił pole mScroller (co jest świetnym początkiem), ale nie pomógł wydłużyć czasu trwania przewijania, ponieważ ViewPager jawnie przekazuje czas trwania do mScroller, gdy żąda przewijania.
Rozszerzanie ViewPager nie działało, ponieważ nie można zastąpić ważnej metody (smoothScrollTo).
Skończyło się na naprawieniu tego, rozszerzając Scroller o ten kod:
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);
}
}
I używając tego w ten sposób:
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) {
}
Zasadniczo zakodowałem czas trwania do 5 sekund i sprawiłem, że mój ViewPager go używa.
Mam nadzieję że to pomoże.