Я использую ObjectAnimator для анимации viewPager. Viewpager вложен в RecyclerView. Если я прокручиваю во время анимации objectAnimator, он генерирует исключение IndexOutOfBound. Вот фрагмент кода:
ObjectAnimator objectAnimator = ObjectAnimator
.ofFloat(new PagerHintMovement(-10, viewPager), "progress", -1f, 1f);
objectAnimator.setInterpolator(new AccelerateInterpolator());
objectAnimator.setDuration(1500);
objectAnimator.setRepeatCount(1);
objectAnimator.setRepeatMode(ValueAnimator.REVERSE);
objectAnimator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
Log.i(TAG, "Animation: Starting fake drag on view pager.");
viewPager.beginFakeDrag();
}
@Override
public void onAnimationEnd(Animator animation) {
Log.i(TAG, "Animation: Ending fake drag on view pager.");
viewPager.endFakeDrag();
viewPager.setCurrentItem(viewPager.getCurrentItem());
}
@Override
public void onAnimationCancel(Animator animation) {
viewPager.setCurrentItem(viewPager.getCurrentItem());
}
@Override
public void onAnimationRepeat(Animator animation) {
if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR2) {
if (animation.getInterpolator() instanceof AccelerateInterpolator) {
animation.setInterpolator(new DecelerateInterpolator());
} else {
animation.setInterpolator(new AccelerateInterpolator());
}
}
}
});
objectAnimator.setStartDelay(1000);
objectAnimator.start();
Вот класс PagerMovement. Выдает исключение при вызове setProgress. viewPager.fakeDragBy (цель * прогресс) вызывает исключение IndexOutOfBound.
class PagerHintMovement {
float goal;
float progress;
ViewPager viewPager;
PagerHintMovement(float goal, ViewPager viewPager) {
this.goal = goal;
this.viewPager = viewPager;
}
public float getProgress() {
return progress;
}
public void setProgress(float progress) {
this.progress = progress;
if (viewPager.isFakeDragging()) {
Log.i("GalleryViewPagerAdapter",
"Animation: Updating fake drag with value=" + goal * progress + "px");
viewPager.fakeDragBy(goal * progress);
}
}
}