嗨,我正在使用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()
。