I have a android.support.v4.view.ViewPager in my application and i have implemented TimerTask to auto scroll the pages and using a custom Scroller to reduce the page transition animation time. I'm trying to stop the auto-scrolling when the user manually scrolls the page.
I followed the @Vikram answer from the below SO question but the programmatic scrolling is detected as user scrolling. And viewPager.OnPageChangeListener is called several times in a single scroll.
Differentiating between user scroll and programatic page change in ViewPager
Is there any way to reduce the transition speed or differentiate user scrolling and programmatic scrolling in this setup?
Here's my custom Scroller class
public class FixedSpeedScroller extends Scroller { private int mDuration = 1000; 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); }} Here's my viewPager setup
public void setUpViewPager() { mIndicator = (PageIndicatorView) findViewById(R.id.pivGroupFlyer); mPager = (ViewPager) findViewById(R.id.vpGroupFlyer); mPager.setAdapter(new GroupFlyerAdapter(this, mFlyerList)); Field mScroller = null; try { mScroller = ViewPager.class.getDeclaredField("mScroller"); mScroller.setAccessible(true); FixedSpeedScroller scroller = new FixedSpeedScroller(mPager.getContext(), new DecelerateInterpolator()); mScroller.set(mPager, scroller); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } mIndicator.setVisibility(View.VISIBLE); mIndicator.setAnimationType(AnimationType.WORM); mIndicator.setRadius(2); mIndicator.setViewPager(mPager); // Auto start of viewpager final Handler handler = new Handler(); final Runnable Update = new Runnable() { public void run() { if (currentPage == mFlyerList.size()) { currentPage = 0; progChange = true; } progChange = true; mPager.setCurrentItem(currentPage++, true); } }; final Timer swipeTimer = new Timer(); swipeTimer.schedule(new TimerTask() { @Override public void run() { handler.post(Update); } }, 4000, 5000); if (!(mFlyerList.size() == 0)) { mGroupHeader.setVisibility(View.INVISIBLE); } mPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if(positionOffsetPixels == 0 ){ } else { if(progChange) { //programmatically-initiated Log.e("APP", "SCROLL"); } else { //user-initiated touch scroll Log.e("USER", "SCROLL"); swipeTimer.cancel(); } progChange = false; } } @Override public void onPageSelected(int position) { } @Override public void onPageScrollStateChanged(int state) { } }); }