Saya sudah mulai dengan kode HighFlyer yang memang mengubah bidang mScroller (yang merupakan awal yang baik) tetapi tidak membantu memperpanjang durasi gulir karena ViewPager secara eksplisit meneruskan durasi ke mScroller saat meminta untuk menggulir.
Memperluas ViewPager tidak berfungsi karena metode penting (smoothScrollTo) tidak dapat diganti.
Saya akhirnya memperbaikinya dengan memperluas Scroller dengan kode ini:
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);
}
}
Dan menggunakannya seperti ini:
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) {
}
Saya pada dasarnya telah melakukan hardcode durasinya menjadi 5 detik dan membuat ViewPager saya menggunakannya.
Semoga ini membantu.