Мое текущее приложение для Android использует ObjectAnimator
для имитации перетаскивания viewpager
.
Большую часть времени анимация выполняется так, как требуется.
Однако периодически анимация не 'вообще не запускается.
Добавляя операторы logcat, я обнаружил, что анимация отменяется.
Что я не понимаю, почему?
Что я делаю / ожидаюнеправильно?
вот мой код: -
@Override
protected void onResume() {
super.onResume();
final Handler handler = new Handler();
handler.postDelayed(() -> animateViewPager(), ANIMATION_DELAY);
}
private void animateViewPager() {
Log.d(TAG, "animateViewPager() called");
final ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(new ViewPagerMovement(), "progress", generateFakeDragValues());
objectAnimator.setDuration(650);
objectAnimator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(final Animator animation) {
Log.d(TAG, "onAnimationStart() called with: animation = [" + animation + "]");
viewPager.beginFakeDrag();
}
@Override
public void onAnimationEnd(final Animator animation) {
Log.d(TAG, "onAnimationEnd() called with: animation = [" + animation + "]");
viewPager.endFakeDrag();
}
@Override
public void onAnimationCancel(final Animator animation) {
Log.d(TAG, "onAnimationCancel() called with: animation = [" + animation + "]");
}
@Override
public void onAnimationRepeat(final Animator animation) {
Log.d(TAG, "onAnimationRepeat() called with: animation = [" + animation + "]");
}
});
objectAnimator.setStartDelay(300);
objectAnimator.start();
}
private float[] generateFakeDragValues() {
final List<Float> fakeDragValues = new ArrayList<>();
final float fakeDrag = calculateFakeDrag();
final float leftOnce = -1f * fakeDrag;
final float rightOnce = 1f * fakeDrag;
final float rightTwice = 2f * fakeDrag;
if (isFirstListItem()) {
fakeDragValues.add(leftOnce);
fakeDragValues.add(rightOnce);
} else if (isLastListItem()) {
fakeDragValues.add(rightOnce);
fakeDragValues.add(leftOnce);
} else if (isOnlyPage()) {
Log.d(TAG, "generateValues: isOnlyPage()");
} else {
fakeDragValues.add(leftOnce);
fakeDragValues.add(rightTwice);
fakeDragValues.add(leftOnce);
}
return Floats.toArray(fakeDragValues);
}
private float calculateFakeDrag() {
return (0.035f * screenWidthPx);
}
private class ViewPagerMovement {
float progress;
public float getProgress() {
return progress;
}
public void setProgress(final float progress) {
Log.d(TAG, "setProgress() called with: progress = [" + viewPager.isFakeDragging() + "]");
if (viewPager.isFakeDragging()) {
viewPager.fakeDragBy(progress);
}
}
}
private boolean isOnlyPage() {
return pagerAdapter.getCount() == 1;
}
private boolean isLastListItem() {
return getPosition() == (pagerAdapter.getCount() - 1);
}
private boolean isFirstListItem() {
return getPosition() == 0;
}
Вот вывод logcat, который показывает цель ObjectAnimator как ноль (???)
2018-12-06 10:17:49.626 5345-5345 D/DetailsActivit: onCreate() called with: savedInstanceState = [null]
2018-12-06 10:17:49.652 5345-5345 D/DetailsActivit: onResume() called
2018-12-06 10:17:49.783 5345-5345 D/DetailsActivit: animateViewPager() called
2018-12-06 10:17:50.093 5345-5345 D/DetailsActivit: onAnimationStart() called with: animation = [ObjectAnimator@3736797, target null progress: -63.0 126.0 -63.0 ]
2018-12-06 10:17:50.094 5345-5345 D/DetailsActivit: onAnimationCancel() called with: animation = [ObjectAnimator@3736797, target null progress: -63.0 126.0 -63.0 ]
2018-12-06 10:17:50.094 5345-5345 D/DetailsActivit: onAnimationEnd() called with: animation = [ObjectAnimator@3736797, target null progress: -63.0 126.0 -63.0 ]
Почемуtarget null?
Существует ли более надежная Android-анимация для искусственного перетаскивания ViewPager?