我的解決方案基於benkc,但第一頁和最後一頁滾動動畫被禁用,當頁面「滾動」到實際頁面時,滾動動畫再次啓用,這個方案可以解決第一個缺點。
但我的ViewPager.setCurrentItem(position, false)
結果仍然有滾動動畫,所以我實現的動畫太快而看不到。
快速滾動動畫這個樣子,不介意的評論,只是我的代碼沒有使用這些方法:
public class FixedSpeedScroller extends Scroller {
private int mDuration = 0;
public FixedSpeedScroller(Context context) {
super(context);
}
@Override
public void startScroll(int startX, int startY, int dx, int dy, int duration) {
super.startScroll(startX, startY, dx, dy, mDuration);
}
@Override
public void startScroll(int startX, int startY, int dx, int dy) {
super.startScroll(startX, startY, dx, dy, mDuration);
}
}
,並用這種方法來viewpager的活動
private Scroller scroller;
private void setViewPagerScroll(boolean instant) {
try {
Field mScroller = null;
mScroller = ViewPager.class.getDeclaredField("mScroller");
mScroller.setAccessible(true);
if (scroller == null) {
scroller = (Scroller) mScroller.get(mViewPager);
}
FixedSpeedScroller fss = new FixedSpeedScroller(mViewPager.getContext());
mScroller.set(mViewPager, instant ? fss : scroller);
} catch (NoSuchFieldException | IllegalArgumentException | IllegalAccessException e) {
e.printStackTrace();
}
}
和像這樣修改onPageScrollStateChanged,只有第一頁或最後一頁(我有5頁)會改變動畫快速滾動,否則有正常滾動:
public void onPageScrollStateChanged(int state) {
if (state == ViewPager.SCROLL_STATE_IDLE) {
if (position == 0) {
setViewPagerScroll(true);
mViewPager.setCurrentItem(3);
} else if (position == 4) {
setViewPagerScroll(true);
mViewPager.setCurrentItem(1);
} else {
setViewPagerScroll(false);
}
}
}
個
FixedSpeedScroller引用是在這裏:http://blog.csdn.net/ekeuy/article/details/12841409
檢查這個 http://stackoverflow.com/q/7546224/1263908 – sique 2012-04-17 08:53:47
http://stackoverflow.com/questions/7440012/infinite-viewpager – blessenm 2012-04-17 08:59:15