如何重置AnimationDrawable

时间:2011-10-07 09:25:07

标签: android animation frame drawable

我必须为循环倒计时器设置动画,我是通过使用AnimationDrawable为ImageView的背景设置动画来实现的(每个图像都删除了圆圈的相应切片)。问题是用户能够暂停此动画,因此我必须重新加载动画,但随后会出现问题。我已经尝试将动画设置为null,将ImageView的背景设置为null,设置动画的可见性,但几乎没有任何帮助,因为帧数保持不变。我必须找到一个解决方法,删除所有帧并添加新帧或将整个动画重置为默认状态。

步骤1 - 初始化动画(起始帧索引为0)

timerView.setBackgroundResource(R.drawable.timer_switch);
timerAnimation = (AnimationDrawable)timerView.getBackground();

System.out.println("Number of frames: " + timerAnimation.getNumberOfFrames());

for (int frameIndex = startingFrameIndex; frameIndex < 60; frameIndex++) {
    if (frameIndex < 10) {
        uri = "drawable/timer_0000" + frameIndex;
    } else {
        uri = "drawable/timer_000" + frameIndex;
    }

    imageResourceId = getResources().getIdentifier(uri, null, getPackageName());
    timerAnimation.addFrame(getResources().getDrawable(imageResourceId), timerImageFrameDuration);
}

第2步 - 这是我不知道该怎么做的棘手部分。我尝试过的事情:

timerAnimation.stop();
timerAnimation.setCallback(null);
timerAnimation.setVisibility(true, false);
timerAnimation = null;

步骤3 - 在调用步骤2之后,我再次调用步骤1,但Sys.out仍然显示60作为当前帧数。 (点击暂停按钮时,此处的起始索引设置为最后一个隐藏的帧。)

欢迎任何想法。

由于

5 个答案:

答案 0 :(得分:85)

一旦调用timerAnimation,这会将(AnimationDrawable)stop()发送到第一帧:

timerAnimation.stop();
timerAnimation.selectDrawable(0);

答案 1 :(得分:13)

我遇到了同样的问题,停止动画会在当前帧停止。我希望它表现得像iOS,停止会回到第一帧。这个解决方案对我有用:

((AnimationDrawable)(someButton.getBackground())).stop();
someButton.setBackgroundDrawable(null);
someButton.setBackgroundResource(R.drawable.animation);

首先停止它(可能没有必要)。然后它杀死了背景动画。最后,它重新创建背景。

答案 2 :(得分:2)

另一种可能的解决方案是为第一帧和最后一帧提供相同的图像,并执行以下操作而不是调用stop()方法。

((AnimationDrawable)(someButton.getBackground())).setOneShot(true);

如果有人进一步研究这个问题。还有一个名为setVisible的方法(boolean visible,boolean restart)。但是,这对我自己不起作用。

答案 3 :(得分:2)

您可以尝试public boolean setVisible (boolean visible, boolean restart),它会播放一次动画。例如:

animationDrawable.setVisible(false, true);

答案 4 :(得分:-2)

android.view.animation.Animation.reset()不起作用?