Android Multiple AnimatorSet重置

时间:2012-08-16 11:49:04

标签: android animation

您好我正在使用AnimatorSet和ValueAnimator将多个动画应用于视图。

当用户触摸视图时,会向视图应用连续的动画。当用户在视图上移动手指时,我这样做是为了“缩放效果”。

视图是自定义图库。

以下是动画的代码:

private void createAnim(final View v) {
    animating = true;
    if (D)
        Log.i(TAG, "sarting animation");
    try {
        v.clearAnimation();
        v.getAnimation().reset();
    } catch (Exception e) {

    }

    set = new AnimatorSet();

    set.addListener(new AnimatorListener() {

        @Override
        public void onAnimationStart(Animator animation) {


        }

        @Override
        public void onAnimationRepeat(Animator animation) {

        }

        @Override
        public void onAnimationEnd(Animator animation) {
            if (D)
                Log.i(TAG, "Animation ended");
            animating = false;
        }

        @Override
        public void onAnimationCancel(Animator animation) {
            animating = false;
            if (D)
                Log.i(TAG, "Animation cancelled");

        }
    });     

    set.setDuration(100);

    ValueAnimator v1 = ObjectAnimator.ofFloat(v, "scaleX", mScaleFactor);
    ValueAnimator v2 = ObjectAnimator.ofFloat(v, "scaleY", mScaleFactor);

    animationList.add(v1);
    animationList.add(v2);
    set.playTogether(v1, v2);

set.start()
}

我有一个onTouchListener,在动作移动中,我连续调用此方法增加或减少mScaleFactor。

当用户释放手指时,我希望视图返回到先前的状态,我的意思是删除所有应用的动画,就好像它们从未应用于视图一样。问题是你可以轻松地为一个动画做到这一点,但对于许多人来说,我找不到正确的方法。这是我尝试过的:

- 将动画添加到ArrayList并对每个动画执行animation.reverse(),并向每个动画添加+100的延迟,以便一个接一个地执行,但最终结果似乎并不完全是与动画之前相同。

v.clearAnimation();仅取消上一个动画  v.getAnimation()复位();同样仅适用于最后/活动动画。 是否有一种方法可以在任何动画启动之前恢复视图? 非常感谢

1 个答案:

答案 0 :(得分:5)

反转AnimatorSet的影响可能很棘手,因为没有“反向”方法。在这种情况下,最简单的方法可能只是另一个与原始方法相反的AnimatorSet。这里的问题是您的AnimatorListener可能不同步。如果你这样做并且你想保留布尔值,那么你必须将其实现为某种信号量。

public static class AnimatorTracker implements AnimatorListener{
    int counter;

    public AnimatorTracker() {
      counter = 0;
    }

    public boolean isAnimating() {
      return counter == 0;
    }

    @Override
    public void onAnimationStart(Animator animation) {
      counter++;
    }

    @Override
    public void onAnimationRepeat(Animator animation) {
    }

    @Override
    public void onAnimationEnd(Animator animation) {
      counter--;
    }

    @Override
    public void onAnimationCancel(Animator animation) {
      // Canceling an animation invokes onAnimationEnd, so nothing needs to be done.
    }
  }

然后就像你刚才那样制作套装:

AnimatorTracker tracker = new AnimatorTracker(); // or make it a global reference
AnimatorSet set = new AnimatorSet();
AnimatorSet reverseSet = new AnimatorSet();

ValueAnimator v1 = ObjectAnimator.ofFloat(v, "scaleX", mScaleFactor);
ValueAnimator v2 = ObjectAnimator.ofFloat(v, "scaleY", mScaleFactor);
ValueAnimator reverseV1 = ObjectAnimator.ofFloat(v, "scaleX", 1.0f);
ValueAnimator reverseV2 = ObjectAnimator.ofFloat(v, "scaleY", 1.0f);


set.addListener(tracker);
set.setDuration(100);
set.playTogether(v1, v2);

reverseSet.addListener(tracker);
reverseSet.setDuration(100);
reverseSet.playTogether(reverseV1, reverseV2);

如果要进行动画制作,请致电set.start()。想要动画回传时调用reverseSet.start()