2012-11-13 54 views
1

我有一个ViewPager它有4页,我想它自动滚动。viewpager自动滚动过快

我在做什么是viewPager.setCurrentItem(index);约束TimerTask其中index是一个预先计算的整数。

逻辑工作正常,但当它滚动时(由setCurrentImte触发),动画太快。

我该如何控制它的滚动速度?请注意我正在谈论滚动动画的速度,而不是连续滚动的间隔。

回答

2

为什么不使用ViewFlipper代替? ViewFlipper内置了处理视图之间自动滚动的功能,这意味着您可以转储计时器。此外,它还实现ViewAnimator,它可以让您完全控制动画。创建自定义动画相对简单,并且您可以控制动画制作所需的时间。一个简单的幻灯片动画教程可以找到here。记下动画xml文件的duration属性。

0

看起来像ViewPager不提供这样的API。我建议做任何以下内容:

  • 采取VieWPager代码(这是在你的Android SDK中其他文件夹),并twek它你需要的方式(例如,添加必要的API)。现在它似乎使用内部常量(MAX_SETTLE_DURATION);
  • 拦截触动你自己,并致电fakeDragBy()(不知道它是什么,你要找的);
0

为什么不尝试这样的事情?使用值动画设置动画滚动值,然后更新定位,以便正确处理片段加载。为我工作得很好:)。

if(pager != null){ 
     ValueAnimator scrollAnimator = ValueAnimator.ofInt(pager.getScrollX(), pager.getScrollX()+2560); 
     final int virtualPage = pager.getCurrentItem(); 
     scrollAnimator.setDuration(1000); 
     scrollAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
      @Override 
      public void onAnimationUpdate(ValueAnimator animation) { 
       pager.setScrollX((Integer)animation.getAnimatedValue()); 
      } 
     }); 
     scrollAnimator.addListener(new Animator.AnimatorListener() { 
      @Override 
      public void onAnimationStart(Animator animation) { 

      } 

      @Override 
      public void onAnimationEnd(Animator animation) { 
       pager.setCurrentVirtualItem(virtualPage, false); 
      } 

      @Override 
      public void onAnimationCancel(Animator animation) { 

      } 

      @Override 
      public void onAnimationRepeat(Animator animation) { 

      } 
     }); 
     scrollAnimator.start(); 
    } 
0

我对开发的应用程序有相同的要求,我的解决方案是这样的。

Observable.range(1, vpAdapter.getCount() - 1) 
      .concatMap(i-> Observable.just(i).delay(5000, TimeUnit.MILLISECONDS)) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(integer -> { 
       currentAutoPage = integer; 

       binding.vpTour.beginFakeDrag(); 
       lastFakeDrag = 0; 
       ValueAnimator va = ValueAnimator.ofInt(0, binding.vpTour.getWidth()); 
       va.setDuration(1000); 
       va.addUpdateListener(animation -> { 
        if (binding.vpTour.isFakeDragging()) { 
         int animProgress = (Integer) animation.getAnimatedValue(); 
         binding.vpTour.fakeDragBy(lastFakeDrag - animProgress); 
         lastFakeDrag = animProgress; 
        } 
       }); 
       va.addListener(new AnimatorListenerAdapter() { 
        @Override 
        public void onAnimationEnd(Animator animation) { 
         super.onAnimationEnd(animation); 
         if (binding.vpTour.isFakeDragging()) { 
          binding.vpTour.endFakeDrag(); 
         } 
        } 
       }); 
       va.start(); 
      }, Throwable::printStackTrace,() -> { 
       if (autoPageChangeDisposable != null && !autoPageChangeDisposable.isDisposed()) { 
        autoPageChangeDisposable.dispose(); 
       } 
      }); 

如果您也想停止自动刷卡当用户手动更改页面不仅仅是获得一次性从这个代码,我写的,是这样的:“一次性autoPageChangeDisposable = Observable.range(1 vpAdapter。 ...“以及寄存器和OnPageChangedListener,并执行此操作:

 vpTour.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
      @Override 
      public void onPageSelected(int position) { 
       if (position != currentAutoPage) { 
        if (autoPageChangeDisposable != null && !autoPageChangeDisposable.isDisposed()) { 
         autoPageChangeDisposable.dispose(); 
        } 
       } 
      } 
     });