Ich habe mit HighFlyers Code begonnen, der zwar das mScroller-Feld geändert hat (was ein guter Anfang ist), aber nicht dazu beigetragen hat, die Dauer des Bildlaufs zu verlängern, da ViewPager die Dauer explizit an den mScroller übergibt, wenn er zum Bildlauf aufgefordert wird.
Das Erweitern von ViewPager hat nicht funktioniert, da die wichtige Methode (oothScrollTo) nicht überschrieben werden kann.
Am Ende habe ich das Problem behoben, indem ich Scroller mit folgendem Code erweitert habe:
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);
}
}
Und so verwenden:
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) {
}
Grundsätzlich habe ich die Dauer auf 5 Sekunden fest codiert und meinen ViewPager dazu gebracht, sie zu verwenden.
Hoffe das hilft.