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