我的解决方案是基于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);
}
}
并使用此方法查看pager的活动
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