如何避免 Animator 动画的加速/减速?
Posted
技术标签:
【中文标题】如何避免 Animator 动画的加速/减速?【英文标题】:How can I avoid acceleration/deceleration on Animator animations? 【发布时间】:2019-01-16 03:06:32 【问题描述】:我使用以下代码创建了一系列(最多 4 个)动画。它们都是同时对几个 ImageView 的简单翻译。
在一个动画“帧”(即所有视图的移动)之后,onAnimationEnd 调用下一帧。
问题是:每次调用 onAnimationEnd 后都会有短暂但明显的延迟。看起来有翻译的自动加速和减速以使其看起来更自然,但在这种情况下这是不需要的。 有没有办法避免这种情况?
提前致谢!
private void animateFrame(final int frame)
List<Animator> allAnimations = new ArrayList<>();
AnimatorSet s = new AnimatorSet();
for (int p = 0; p < playerImages.size(); p++)
Animator animation = ObjectAnimator.ofFloat(playerImages.get(p), "translationX", playerPositions[frame][0][p] * factorX);
allAnimations.add(animation);
ObjectAnimator animation2 = ObjectAnimator.ofFloat(playerImages.get(p), "translationY", playerPositions[frame][1][p] * factorY);
allAnimations.add(animation2);
Log.d(TAG, "onClick: MOVING PLAYER " + p + " TO: " + playerPositions[frame][0][p] + "/" + playerPositions[frame][1][p]);
if (playerPositions[frame][0][p] != 0)
s.playTogether(allAnimations);
s.setDuration(durations[frame - 1]);
s.start();
s.addListener(new Animator.AnimatorListener()
@Override
public void onAnimationStart(Animator animator)
@Override
public void onAnimationEnd(Animator animator)
animateFrame(frame+1);
@Override
public void onAnimationCancel(Animator animator)
@Override
public void onAnimationRepeat(Animator animator)
);
【问题讨论】:
【参考方案1】:引用Property Animation Overview
插值器定义如何将动画中的特定值计算为时间的函数。例如,您可以指定动画在整个动画中线性发生,这意味着动画在整个时间均匀移动,或者您可以指定动画使用非线性时间,例如,在开始或结束时使用加速或减速动画。
属性动画的默认插值器是AccelerateDecelerateInterpolator
。但是您可以设置另一个插值器(任何实现TimeInterpolator
的类)。根据您的问题,我认为您正在寻找LinearInterpolator
:
animation.setInterpolator(new LinearInterpolator());
【讨论】:
以上是关于如何避免 Animator 动画的加速/减速?的主要内容,如果未能解决你的问题,请参考以下文章
让View具有减速效果的动画——FlingAnimation