您好我正在使用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()复位();同样仅适用于最后/活动动画。 是否有一种方法可以在任何动画启动之前恢复视图? 非常感谢
答案 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()
。