我有一个ViewPager
4 页,我希望它自动滚动。
我正在做的事情 与一个预先计算的整数viewPager.setCurrentItem(index);
绑定在一起。TimerTask
index
逻辑工作正常,但是当它滚动(由 触发setCurrentImte
)时,动画太快了。
如何控制它的滚动速度?请注意,我说的是滚动动画速度,而不是 2 次连续滚动的间隔。
我有一个ViewPager
4 页,我希望它自动滚动。
我正在做的事情 与一个预先计算的整数viewPager.setCurrentItem(index);
绑定在一起。TimerTask
index
逻辑工作正常,但是当它滚动(由 触发setCurrentImte
)时,动画太快了。
如何控制它的滚动速度?请注意,我说的是滚动动画速度,而不是 2 次连续滚动的间隔。
为什么不使用ViewFlipper呢?ViewFlipper 内置了处理视图之间自动滚动的功能,这意味着您可以转储计时器。此外,它还实现了 ViewAnimator,让您可以完全控制动画。创建自定义动画相对简单,您可以控制动画所需的时间。可以在此处找到幻灯片动画的简单教程。记下动画 xml 文件的持续时间属性。
看起来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();
}
});
如果您还想在用户手动更改页面时停止自动滑动,而不仅仅是从我编写的代码中获取一次性用品,例如:“Disposable 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();
}
}
}
});