为什么在我的ObjectAnimator上间歇性地调用onAnimationCancel()?

时间:2018-12-06 10:36:08

标签: android android-viewpager android-animation objectanimator

我当前的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目标显示为null(???)

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  ]

目标为何为空?

是否存在用于伪造ViewViewr的更可靠的Android动画?

0 个答案:

没有答案