我有一个ViewPager
它有4页,我想它自动滚动。viewpager自动滚动过快
我在做什么是viewPager.setCurrentItem(index);
约束TimerTask
其中index
是一个预先计算的整数。
逻辑工作正常,但当它滚动时(由setCurrentImte
触发),动画太快。
我该如何控制它的滚动速度?请注意我正在谈论滚动动画的速度,而不是连续滚动的间隔。
我有一个ViewPager
它有4页,我想它自动滚动。viewpager自动滚动过快
我在做什么是viewPager.setCurrentItem(index);
约束TimerTask
其中index
是一个预先计算的整数。
逻辑工作正常,但当它滚动时(由setCurrentImte
触发),动画太快。
我该如何控制它的滚动速度?请注意我正在谈论滚动动画的速度,而不是连续滚动的间隔。
为什么不使用ViewFlipper代替? ViewFlipper内置了处理视图之间自动滚动的功能,这意味着您可以转储计时器。此外,它还实现ViewAnimator,它可以让您完全控制动画。创建自定义动画相对简单,并且您可以控制动画制作所需的时间。一个简单的幻灯片动画教程可以找到here。记下动画xml文件的duration属性。
看起来像ViewPager不提供这样的API。我建议做任何以下内容:
MAX_SETTLE_DURATION
);为什么不尝试这样的事情?使用值动画设置动画滚动值,然后更新定位,以便正确处理片段加载。为我工作得很好:)。
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();
}
我对开发的应用程序有相同的要求,我的解决方案是这样的。
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();
}
}
}
});