嗨,我正在使用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,在action move中,我依次调用这个方法来增加或减少mscalefactor。
当用户释放手指时,我希望视图返回到以前的状态,我的意思是删除所有应用的动画,就像它们从未应用到视图一样。问题是你可以很容易地为一个动画,但对于许多这样的我只是找不到正确的方式。以下是我尝试过的:
-将动画添加到ArrayList中并对每个动画执行animation.reverse(),每个动画添加+100的延迟,以便一个接一个地执行,但最终结果似乎与以前的动画不完全相同。
v.clearAnimation();仅取消上一个动画
v.getAnimation().reset();同样的方法只适用于最后一个/活动的动画。
有没有一种方法可以让视图恢复到启动任何动画之前的状态?
谢谢

最佳答案

逆转AnimatorSet的效果可能很棘手,因为没有“reverse”方法。在这种情况下,最简单的方法可能是另一种与原始方法相反的方法。这里的问题是您的AnimatorSet可能不同步。如果这样做,并且希望保留布尔值,则必须将其实现为某种程度上的信号量。

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);

如果要设置前进动画,请调用AnimatorListener。当你想重新设置动画时,调用set.start()

10-06 16:18