gpt4 book ai didi

Android Multiple AnimatorSet 重置

转载 作者:搜寻专家 更新时间:2023-11-01 07:35:24 26 4
gpt4 key购买 nike

您好,我正在使用 AnimatorSet 和 ValueAnimator 将多个动画应用到一个 View 。

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

View 是一个自定义画廊。

这是动画的代码:

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 移动时我连续调用此方法来增加或减少 mScaleFactor。

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

-将动画添加到 ArrayList 并在每个动画上执行 animation.reverse() 并为每个动画添加 +100 的延迟,这样一个接一个地执行,但最终结果似乎并不完全是和以前的动画一样。

v.clearAnimation();只取消最后一个动画v.getAnimation().reset();同样只适用于最后/Activity 动画。有没有一种方法可以让 View 恢复到任何动画开始之前的状态?非常感谢

最佳答案

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

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

关于Android Multiple AnimatorSet 重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11986455/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com