Почему onAnimationCancel () периодически вызывается в моем ObjectAnimator? - PullRequest
0 голосов
/ 06 декабря 2018

Мое текущее приложение для 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?

...