我当前的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动画?